csu 10月 月赛 J 题
Description
CSU又到了一年中评奖学金的时候了……各大学霸都或多或少地拿到了各种奖学金(你们自己看着办吧)。
在这里,评奖学金有个很奇怪的规矩——每个同学得到的奖学金数一定满足相邻的两个非零数位上的数字不相等(奖学金都是非负整数,如果一个同学没有得到奖学金,我们也可以认为学校发给ta的奖学金为0)。
然而,如果你问这里的孩子拿了多少奖学金,ta不会直接告诉你拿到了多少奖学金,而会告诉你ta拿到的奖学金数大于某一个整数X。同时为了不产生歧义,ta所说的那个数和ta所拿到的那个奖学金数目之间不会存在任何一个数满足学校发奖的规矩。
现在你已经知道了每个同学说的那个整数X,你能确切地说出每个同学得到了多少奖学金吗?
Input
一组测试数据。
第一个数N,表示接下来有N个同学告诉了你ta的获奖信息(N<10000)
接下来每行一个整数X,表示一名同学所说的那个整数X。(X不超过int范围)
Output
总共N行,每行一个数,表示该同学拿到了多少奖学金。
题目保证每个同学实际拿到的奖学金数目不会超过10 ^8。(Orz,学霸啊)
Sample Input
5 1 10 20 98 15995112
Sample Output
2 12 21 100 16000000
HINT
对于64位整形,请用%lld,或者cin,cout。T_T
CSU_LQ
今天的水题特别多,我们A了6题,不错,纪念下;
这也是个水题,纯模拟;
这个题稍微有点繁琐,为了锻炼自己的逻辑,还是硬着头皮敲了遍;
代码:
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 char s[20]; 5 int l,t,ce; 6 bool flag,ff; 7 int check() 8 { 9 for(int i=1; i<l; i++)if(s[i]!='0'&&s[i]==s[i-1])return i; 10 return 0; 11 } 12 void add(int ce) 13 { 14 s[ce]++; 15 while(s[ce]>'9') 16 { 17 if(ce==0) 18 { 19 flag=1; 20 s[ce]='0'; 21 break; 22 } 23 s[ce]='0'; 24 s[--ce]++; 25 } 26 } 27 int main() 28 { 29 scanf("%d",&t); 30 while(t--) 31 { 32 scanf("%s",&s); 33 if(s[0]=='-'){puts("0");continue;} 34 l=strlen(s); 35 flag=0,ff=1; 36 add(l-1); 37 if(l>1)while(1) 38 { 39 int ce=check(); 40 if(ce==0)break; 41 if(ff) 42 { 43 for(int i=ce+1; i<l; i++)s[i]='0'; 44 ff=0; 45 } 46 add(ce); 47 } 48 if(flag)printf("1"); 49 puts(s); 50 } 51 return 0; 52 }