题目大意:
给出一个序列,代表原序列对应位置数的每一位的数字之和,原序列单调递增,问原序列的最后一个数最小的方案每一个数是多少。
思路:贪心,从1到n,我们尽量让每个数最小就可以了。
1 #include2 #include 3 #include 4 #include 5 #include 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) g[i]+=y-x,x=y;48 else x+=9-g[i],g[i]=9;49 if (g[0] =1;j--)57 printf("%d",g[j]); 58 puts(""); 59 }60 return 0;61 }