【构造】Codeforces Round #289 509C Sums of Digits

来源:互联网 发布:net.sft.json包 下载 编辑:程序博客网 时间:2024/05/21 10:31

点击打开链接

已知N个数位数和,要求构造N个数,使第N个数最小,并且数列要递增。

(即所有的数都要最小)

主要考虑a[ i-1 ]<a[ i ] 的问题,尽量将低位的增大,使得大于上一个数。

#include <cstdio>#include <cstring>#include <cstdlib>#include <string>#include <iostream>#include <algorithm>#include <sstream>#include <cmath>using namespace std;#include <queue>#include <stack>#include <set>#include <vector>#include <deque>#include <map>#define cler(arr, val)    memset(arr, val, sizeof(arr))typedef long long  LL;const int MAXN = 1000100;const int MAXM = 140000;const int INF = 0x7fffffff;const int mod = 1000000007;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int len,a[500],b[500];void get(int num){    for(int i=1;num;i++)    {        while(b[i]<9&&num)        {            b[i]++,num--;        }        if(i>len&&!num) len=i;    }}void print(){    for(int i=len;i>=1;i--)        printf("%d",b[i]);    printf("\n");}int main(){    int n;    cin>>n;    for(int i=1;i<=n;i++)        cin>>a[i];    get(a[1]);    print();    for(int i=2;i<=n;i++)    {        if(a[i]>a[i-1])            get(a[i]-a[i-1]);        else        {            int t=a[i]-a[i-1],k=1;            while(true)            {                if(k>len) len=k;                if(b[k]!=9&&t>0)                {                    b[k]++,t--;                    get(t);                    break;                }                t+=b[k],b[k]=0;                k++;            }        }        print();    }    return 0;}


0 0
原创粉丝点击