Codeforces 509C Sums of Digits

http://codeforces.com/contest/509/problem/C

 题目大意:

给出一个序列,代表原序列对应位置数的每一位的数字之和,原序列单调递增,问原序列的最后一个数最小的方案每一个数是多少。

思路:贪心,从1到n,我们尽量让每个数最小就可以了。

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<iostream>
 6 int g[200005],n,a[200005];
 7 int read(){
 8     int t=0,f=1;char ch=getchar();
 9     while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
10     while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
11     return t*f;
12 }
13 void work(int x,int y){
14     if (x==y){
15         g[1]++;
16         int i=1;
17         while (i<=g[0]||g[i]>9){
18             g[i+1]+=g[i]/10;
19             g[i]%=10;
20             i++;
21         }
22         while (i>1&&g[i]==0) i--;
23         g[0]=i;
24         x=0;
25         for (int i=1;i<=g[0];i++)
26          x+=g[i];
27     }
28     if (x>y){
29         int j=0,i;
30         for (i=1;i<=g[0]&&x-j>=y;i++) j+=g[i];
31         while (g[i]==9) i++;
32         for(g[i--]++;i;i--) g[i]=0;
33         int k=1;
34         while (k<=g[0]||g[k]>9){
35             g[k+1]+=g[k]/10;
36             g[k]%=10;
37             k++;
38         }
39         while (k>1&&g[k]==0) k--;
40         g[0]=k;
41         x=0;
42         for (int i=1;i<=g[0];i++)
43          x+=g[i];
44     }
45     int i;
46     for (i=1;x<y;i++)
47      if (9-g[i]+x>=y) g[i]+=y-x,x=y;
48          else x+=9-g[i],g[i]=9;
49     if (g[0]<i-1) g[0]=i-1;     
50 }
51 int main(){
52     n=read();
53     for (int i=1;i<=n;i++) a[i]=read();
54     for (int i=1;i<=n;i++){
55         work(a[i-1],a[i]);
56         for (int j=g[0];j>=1;j--)
57          printf("%d",g[j]); 
58         puts("");  
59     }
60     return 0;
61 }

 

posted @ 2016-06-30 15:04  GFY  阅读(149)  评论(0编辑  收藏  举报