题意:
给出n个数字,这些数字数由另外n个数字各个位数的和得来的。求另外n个数,要尽量小,而且要递增。
题解:
贪心,对位进行操作,有点像数位dp。
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const int oo=0x3f3f3f3f;
const ll OO=1LL<<61;
const ll MOD=1000000007;
const int maxn=505;
int a[maxn];
int bit[maxn],len;
int cal(int n)
{
int i;
for(i=1;n;i++)
{
while(bit[i]<9&&n)
{
bit[i]++;
n--;
}
if(i>len&&!n)len=i;
}
}
void output()
{
for(int i=len;i>=1;i--)
printf("%d",bit[i]);
puts("");
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(bit,0,sizeof bit);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
cal(a[1]);
output();
for(int i=2;i<=n;i++)
{
if(a[i]>a[i-1])
cal(a[i]-a[i-1]);
else
{
int k=1,t=a[i]-a[i-1];
while(1)
{
if(k>len)len=k;
if(bit[k]<9&&t>0)
{
bit[k]++;
t--;
cal(t);
break;
}
t+=bit[k];
bit[k]=0;
k++;
}
}
output();
}
}
return 0;
}
/**
*/