Codeforces Round #289 (Div. 2, ACM ICPC Rules)
给你一个数b[i],求出各个位上数字和为b[i]的数a[i],要求所有数字是递增的
法1:
1.b[i]-b[i-1]>0 ,那么从最低位开始加1,直到得到所求的数
2.else,从最低位开始累加差值,直到差值为正的,转1
法2:纯模拟,有个优化,位数为j的数,各个位上数的和最大为j*9,如果当前和now+9*j>=sum&&now<=sum,那么从最低位到最高位的前一位执行s[k]=min(sum-now,9)+'0',就行了
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
string solve(int sum,int f){
reverse(s.begin(),s.end());
int now=0;
for(int i=0;i<s.size();++i) now+=s[i]-'0';
if(now==sum&&f>0) {reverse(s.begin(),s.end());return s;}
for(int i=0;i<s.size();++i){
while(s[i]<'9'){
now++;
s[i]++;
if(i*9+now>=sum&&now<=sum){
for(int k=0;k<i;++k){
s[k]=min(sum-now,9)+'0';
now+=s[k]-'0';
}
reverse(s.begin(),s.end());
return s;
}
}
s[i]-=9;
now-=9;
}
s.push_back('1');
reverse(s.begin(),s.end());
return solve(sum,++f);
}
int main()
{
int x;
s="0";
cin>>n;
for(int i=0;i<n;++i){
scanf("%d",&x);
cout<<solve(x,0)<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,b[310],len;
int digit[350];
void solve(int d){
for(int i=1;d;++i){
while(d&&digit[i]<9){
d--;
digit[i]++;
}
len=i>len ?i:len;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i)scanf("%d",&b[i]);
for(int i=1;i<=n;++i){
int d=b[i]-b[i-1];
if(d>0){
solve(d);
}else{
for(int i=1;;++i){
len=i>len?i:len;
if(d>0&&digit[i]<9){
d--;
digit[i]++;
solve(d);
break;
}
d+=digit[i];
digit[i]=0;
}
}
for(int i=len;i>=1;--i){
printf("%d",digit[i]);
}puts("");
}
return 0;
}