• [模拟]Codeforces509C Sums of Digits


    题目链接

    题意:给n个数a[i], 要求b[i]每位数的和等于a[i], 并且b[i]要严格递增 求最小的b[i]

    b[0]最小一定是X9999...这样的形式

    后面的b[i]位数一定大于等于前一个

    用ans[i][0]记录b[i]的位数

    也就是 每次从ans[i-0][0]位开始 若不满足b[i]>b[i-1] 则位数加1

    位数加1之后 必定满足b[i]>b[i-1] 则之后只需用递归遍历各位即可

     1 int a[305];
     2 int ans[305][1005];
     3 bool dfs(int i, int num, int sum, bool f)
     4 {
     5 //    printf("**********
    %d %d %d %d
    **********
    ", i, num, sum, f);
     6     if(!num)
     7         return f;
     8     for(int j=(f? (num==ans[i][0]? 1:0):ans[i-1][num]);j<=9;j++)
     9         if(j+9*(num-1)>=sum && sum>=j && dfs(i, num-1, sum-j, f || j>ans[i-1][num]))
    10         {
    11             ans[i][num]=j;
    12             return true;
    13         }
    14     return false;
    15 }
    16 int main()
    17 {
    18     int n;
    19     while(~scanf("%d", &n))
    20     {
    21         for(int i=1;i<=n;i++)
    22             scanf("%d", &a[i]);
    23         memset(ans, 0, sizeof(ans));
    24         while(a[1]>9)
    25             a[1]-=9, ans[1][++ans[1][0]]=9;
    26         ans[1][++ans[1][0]]=a[1];
    27         for(int i=ans[1][0];i>0;i--)
    28             printf("%d", ans[1][i]);
    29         printf("
    ");
    30         for(int i=2;i<=n;i++)
    31         {
    32             ans[i][0]=ans[i-1][0];
    33             while(ans[i][0]*9<a[i])
    34                 ans[i][0]++;
    35             if(!dfs(i, ans[i][0], a[i], ans[i][0]>ans[i-1][0]))
    36             {
    37                 ans[i][0]++;
    38                 dfs(i, ans[i][0], a[i], true);
    39             }
    40             for(int j=ans[i][0];j>0;j--)
    41                 printf("%d", ans[i][j]);
    42             printf("
    ");
    43         }
    44     }
    45     return 0;
    46 }
    Codeforces 509C
  • 相关阅读:
    oracle数据库连接不上
    Oracle的regexp_instr函数简单用法
    Oracle中dbms_random.string 的用法
    oracle 简单输出语句与赋值
    oracle中sequence(自增序号)的用法
    oracle 函数的返回值与out参数
    SQL%ROWCOUNT作用
    100多个基础常用JS函数和语法集合大全
    题解【AcWing272】最长公共上升子序列
    题解【POJ1062】昂贵的聘礼
  • 原文地址:https://www.cnblogs.com/Empress/p/4266892.html
Copyright © 2020-2023  润新知