传送门:http://codeforces.com/contest/509/problem/C
解题思路:给你一个序列B(序列B为序列A的数位和) 问你求A
两种情况讨论 设a[i]-a[i-1]=num
num>0 可以直接加1 (如果该位已经为9 就换到下一位上加)
num<0 这里就比较麻烦了 考虑他需要从后面借出这个num的值。而且要加到前面。这样一加一减。前面加了1 后面还需要多减去1
得到num-1这个数字。高位的值不变。低位的值把他再和第一种情况一样做就可以了。
AC代码
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
#define INF 0x0f0f0f0f
using namespace std;
int b[405],len,n,a[305];
void solve(int num)
{
for (int i=1;num;++i){
while (b[i]<9 && num){
b[i]++;
num--;
}
if (i>len && !num) len=i;
}
}
void print()
{
int i;
for(i=len;i>0;i--) printf("%d",b[i]);
printf("\n");
}
int main()
{
int i,j,k,l,m;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&a[i]);
solve(a[1]);
print();
for(int i=2;i<=n;++i)
{
int delta=a[i]-a[i-1];
if (delta>0)
{
solve(delta);
print();
}
else
{
int k=1;
while(1)
{
if(k>len) len=k;
if(b[k]<9 && delta>0)
{
++b[k];
solve(delta-1);
print();
break;
}
delta+=b[k];
b[k]=0;
k++;
}
}
}
return 0;
}