1427: 數字轉換
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 379 Solved: 93
Submit Status Web Board
Description
老師交給小明一個任務,有兩個數字x和y(x<y),通過以下兩種操作:一、将x乘以2;二、将x的值加上1。小明希望能通過盡可能少的操作來完成這個任務,但是不知道怎麼做,現在請大家來幫幫他的忙吧。
Input
兩個整數x,y(0<=x<y<=10^6)。
Output
一個整數n,表示最少經過多少次操作,x可以變成y。
Sample Input
2 5 10 80
Sample Output
2 3
HINT
Source
鄭輕第六屆校賽
閑來無事刷刷别人家的校賽題,感覺還挺水的,我都水了6個題,可能今天狀态還好吧,,不過今天還有個字典樹是卡住了,,下次再看吧,,唉。。。(一刷就上瘾了,都沒去看大物了,,明天好好看書複習
)
AC代碼:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int x, y;
while(scanf("%d %d", &x, &y) != EOF)
{
int cnt = 0;
if(x == 0) { x = 1; cnt++; }
while(x != y)
{
if(y/2 >= x)
{
cnt++;
if(y&1) cnt++;
y = y / 2;
}
else
{
y--;
cnt++;
}
}
printf("%d\n", cnt);
}
return 0;
}
1428: 神秘密碼
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 256 Solved: 147
Submit Status Web Board
Description
小Q是一名标準的IT宅男,同時也是一名軟賤攻城獅,主攻加解密算法。由于他實在是太喜歡加密解密神馬的、以至于這個晚上、他在做夢的時候還在想着加解密的事情囧~。
夢中,他不慎進入了一個密碼的世界,這個小世界中雜亂無序的漂浮着一些整數。他稀裡糊塗的知道、闖出這個小世界的關鍵是找到所謂的“密碼鑰匙”,鑰匙是一個字元串,由天上這些整數構成。同時,他也很不科學的知道這些整數的正确的順序。也知道每個字元串中的每個字元就是對應整數的ASCII碼字元。而問題的關鍵是,他不記得整數與字元之間的ASCII映射。
“這怎麼辦,難道我就困在這個這裡出不去了麼T_T?我是很喜歡解密,但是。。
人家還木有女盆友、
人家還沒有掙到Money、
人家還沒有買車、
人家還沒有買房、
人家還沒有。。。
人家。。哇啊兒。。。。”好吧,這厮。。哭了。。。
原諒這位整天隻知道鑽研技術、而不經世事的童鞋吧。那你來幫他一下腫麼樣?
Input
輸入有T(1<=T<=100)組。
每組一個整數n(1<=n<=1000),而後有n個正整數。
保證輸入合法。
Output
對于每組,請輸出密碼鑰匙,每組占一行。
Sample Input
1 27 65 67 77 32 105 115 32 104 101 97 108 116 104 121 44 32 106 117 115 116 32 100 111 32 105 116 33
Sample Output
ACM is healthy, just do it!
HINT
Source
鄭輕第六屆校賽
AC代碼:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[1005];
int main()
{
int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
for(int i=0; i<n; i++)
printf("%c", a[i]);
printf("\n");
}
return 0;
}
1430: 多少個0
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 213 Solved: 56
Submit Status Web Board
Description
一個n*n的方格,每個格子中間有一個數字是2或者5,現在從方格的左上角走到右下角,每次隻能選擇向下或者向右移動一格兩種移動方式,讓所有經過的格子中的數字相乘,求使最後的結果中末尾處0的數字最少。
Input
第一行是一個正整數n(0<n<100)。
接下來n行是一個n*n的矩陣。
Output
一個正整數m,表示最後的結果末尾處最少有m個0。
Sample Input
4 2 5 2 5 5 2 5 2 2 5 5 5 2 2 2 2
Sample Output
1
HINT
Source
鄭輕第六屆校賽
思路:DP,去找2和5在一條路徑(左上到右下)上數目的最大值
AC代碼:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
int a[105][105];
int dp2[105][105];
int dp5[105][105];
int main()
{
while(scanf("%d", &n) != EOF)
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d", &a[i][j]);
memset(dp2, 0, sizeof(dp2));
memset(dp5, 0, sizeof(dp5));
if(a[1][1] == 2) dp2[1][1] = 1;
else dp5[1][1] = 1;
for(int i=2; i<=n; i++)
{
for(int j=1; j<=i; j++)
{
dp5[i][j] = max(dp5[i-1][j], dp5[i][j-1]);
dp2[i][j] = max(dp2[i-1][j], dp2[i][j-1]);
if(a[i][j] == 2) dp2[i][j]++;
else dp5[i][j]++;
dp5[j][i] = max(dp5[j][i-1], dp5[j-1][i]);
dp2[j][i] = max(dp2[j][i-1], dp2[j-1][i]);
if(a[j][i] == 2) dp2[j][i]++;
else dp5[j][i]++;
}
}
int ma = max(dp2[n][n], dp5[n][n]);
//printf("%d %d\n", dp2[n][n], dp5[n][n]);
printf("%d\n", 2 * n - 1 - ma);
}
return 0;
}
1432: 背包again
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 193 Solved: 53
Submit Status Web Board
Description
Gy最近學習了01背包問題,無聊的他又想到了一個新的問題,給定n個物品的價值,和01背包一樣,每個物品隻能選1次或0次,求最小不能被得到的價值。
Input
第一行一個正整數T(T <= 100),表示有T組資料。
每組資料輸入格式如下:
第一行為一個正整數N(N<=100),表示物品個數。
第二行N個正整數,表示每個物品的價值vi(1<=vi<=1000000)
Output
共輸出T行,即每組資料相應答案。
Sample Input
2 3 2 4 8 4 1 2 4 8
Sample Output
1 16
HINT
Source
鄭輕第六屆校賽
AC代碼:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int a[N];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n, m;
scanf("%d", &n);
for(int i=0; i<n; i++) scanf("%d", &a[i]);
sort(a, a+n);
m = 0; //m代表從0到m都能被得到 (DP思想)
for(int i=0; i<n; i++)
{
if(a[i] - m > 1) //如果目前的數比m還大超過1的話,m+1就是最小不能被得到的,可以用反證證明
break;
m = m + a[i];
}
printf("%d\n", m + 1); //因為0到m都能被得到,是以m+1不能被得到
}
return 0;
}
1433: What are you doing?
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 221 Solved: 103
Submit Status Web Board
Description
“Hey my friends!What are you doing?”
小夥伴們都在期待了N多年的大學中度過一段時間了,不知道大家都在忙什麼呢?有咩有找到自己奮鬥的目标?
據說有個叫LOL的幫派橫空出世了,影響了無數大學的宅同胞。這裡面有兩個好鬥的角色,一個叫PanSen(簡稱PS),一個叫JanSheng(簡稱JS)。這兩個家夥以好鬥聞名、外人稱為“雙雄”。不過他倆誰都不服對方,隻要一見面、就必然會很“親熱”地招呼對方。(當然、用他們自己的話說是在傳遞愛與友誼。不過路人怎麼總會覺得有點殘忍類。。)
就在剛剛,這倆家夥又見面了。
“秃,那厮,灑家終于練就了無上神功。每個第 x 次攻擊可釋放一次大招,讓這一次的攻擊造成 c 倍傷害給你。你就認命吧!”PS道。
“呦~,我當時誰呢,在下不才、也剛練成了一點點小本事。每攻擊 y 次後可以觸發一個神狀态,從下一次攻擊開始、連續 z 次的攻擊都可以造成雙倍傷害,z次攻擊過去之後、再重新開始為下一次神狀态充電。讓我好好‘招待你吧’!”JS回道。
“公豬母豬加油、大豬小豬加油~”路人甲喊着。
“閉嘴!”,“住口!”雙雄扭頭、同時發話。
“有奸情,果然、感情是打出來的,古人誠不欺我。。”,路人乙小聲嘀咕。
雙雄滿腦黑線、毆鬥繼續。。。。
好了,這個戰鬥發生在剛剛,那麼告訴你一些資訊,你可以判斷出最後誰勝出了麼?
已知:
1、PS每次攻擊可以讓JS掉 a 點血,JS每次攻擊可以讓PS掉 b 點血;
2、PS有血量HP_p,JS有血量HP_j,血量不大于0即代表失敗,戰鬥結束;
3、按照不成文規定,倆家夥是輪流攻擊對方,JS先發動攻擊。
Input
輸入有T組。
每組按順序讀入多個整數:
HP_p、HP_j(0<HP_p、HP_j<=1000),表示PanSen和JanSheng的生命值;
a、b、c、x、y、z(0<a、b、c、x、y、z<=1000),意義如上。
輸入保證合法。
Output
對于每組,輸出獲勝人的名字的簡稱、單獨占一行。
Sample Input
2 10 10 1 1 2 9 9 2 10 10 1 1 2 9 7 2
Sample Output
PS JS
HINT
适度LOL可練就反應迅速等無上神功,但過度LOL則有損身心健康,适度就好。
望各位小夥伴找到自己奮鬥的目标、并早日成功。
Source
鄭輕第六屆校賽
AC代碼:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int T;
int PS, JS, a, b, c, x, y, z;
scanf("%d", &T);
while(T--)
{
scanf("%d %d %d %d %d %d %d %d", &PS, &JS, &a, &b, &c, &x, &y, &z);
int cur = 1;
while(1)
{
if(PS <= 0 || JS <= 0) break;
if(cur % x == 0) JS -= c;
else JS -= a;
if((cur-1) % ( y + z ) <= y) PS -= b;
else PS -= 2*b;
cur++;
}
if(PS <= 0) printf("JS\n");
else printf("PS\n");
}
return 0;
}
1435: A+B
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 159 Solved: 114
Submit Status Web Board
Description
喜聞樂見A+B。
讀入兩個用英文表示的A和B,計算它們的和并輸出。
Input
第一行輸入一個字元串,表示數字A;第二行輸入一個字元串表示數字B。A和B均為正整數。
Output
輸出一個正整數n,表示A+B的和(A+B<100)。
Sample Input
one five four three four two six
Sample Output
1960
HINT
從0到9的對應的英文單詞依次為:zero, one , two , three , four , five , six , seven , eight , nine 。
Source
鄭輕第六屆校賽
AC代碼:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int fun(char a[])
{
int len = strlen(a), ans = 0;
for(int i=0; i<len; i++)
{
if(a[i] == 'z' && a[i+1] == 'e') { ans = ans * 10 + 0; i += 4; }
else if(a[i] == 'o' && a[i+1] == 'n') { ans = ans * 10 + 1; i += 3; }
else if(a[i] == 't' && a[i+1] == 'w') { ans = ans * 10 + 2; i += 3; }
else if(a[i] == 't' && a[i+1] == 'h') { ans = ans * 10 + 3; i += 5; }
else if(a[i] == 'f' && a[i+1] == 'o') { ans = ans * 10 + 4; i += 4; }
else if(a[i] == 'f' && a[i+1] == 'i') { ans = ans * 10 + 5; i += 4; }
else if(a[i] == 's' && a[i+1] == 'i') { ans = ans * 10 + 6; i += 3; }
else if(a[i] == 's' && a[i+1] == 'e') { ans = ans * 10 + 7; i += 5; }
else if(a[i] == 'e' && a[i+1] == 'i') { ans = ans * 10 + 8; i += 5; }
else if(a[i] == 'n' && a[i+1] == 'i') { ans = ans * 10 + 9; i += 4; }
}
return ans;
}
int main()
{
char str1[205], str2[205];
while(gets(str1) != NULL)
{
gets(str2);
printf("%d\n", fun(str1) + fun(str2));
}
return 0;
}