Contest2037 - CSU Monthly 2013 Oct (problem J 1327 :Scholarship)
你为何这么叼!
1327: Scholarship
Time Limit: 1 Sec Memory Limit: 32 MBSubmit: 291 Solved: 75
[Submit][Status][Web Board]
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
Source
一道煞笔题能WA一下午,你TM在逗我!
1 #include <cstdio> 2 #include <vector> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 #define INF 0x7fffffff 7 #define maxn 1005 8 #define mod 1000000007 9 int x,n,m; 10 int a[15]; 11 int d[15]; 12 void judge(){ 13 int b[15]={0}; 14 memset(d,0,sizeof d); 15 int i=0; 16 while(x){b[i++]=x%10;x/=10;} 17 int k=i; 18 for(int i=1;i<=k;i++)d[i]=b[k-i]; 19 for(i=1;i<k&&i>=0;) 20 if(d[i]==d[i+1]&&d[i]!=0){ 21 d[i+1]=(d[i+1]+1)%10; 22 while(d[i+1]==0&&i>=0){d[i]=(d[i]+1)%10;i--;} 23 if(d[i]!=d[i+1])break; 24 } 25 else i++; 26 x=0; 27 for(int j=0;j<=i+1;j++)x=x+d[j]*a[k-j]; 28 } 29 int main(){ 30 a[0]=1; 31 for(int i=1;i<10;i++)a[i]=a[i-1]*10; 32 scanf("%d",&n); 33 while(n--){ 34 scanf("%d",&x); 35 if(x<0){printf("0\n");continue;} 36 x++; 37 judge(); 38 printf("%d\n",x); 39 } 40 return 0; 41 }
浙公网安备 33010602011771号