• Codeforces 509C Sums of Digits


    题意:给你一个数列 b,其中bi 为 ai 的数字和,ai是一个单调递增的序列,问你求出 an 最小的那个可能的序列

    解题思路:  an 最小其实也就是使得 ai 最小 ,ai最小就是枚举 前k 位都和 a[i-1] 相等,在 第k-1位的时候 大于 a[i-1]即可。

    解题代码:

     1 // File Name: 509.cpp
     2 // Author: darkdream
     3 // Created Time: 2015年03月24日 星期二 10时01分03秒
     4 
     5 #include<vector>
     6 #include<list>
     7 #include<map>
     8 #include<set>
     9 #include<deque>
    10 #include<stack>
    11 #include<bitset>
    12 #include<algorithm>
    13 #include<functional>
    14 #include<numeric>
    15 #include<utility>
    16 #include<sstream>
    17 #include<iostream>
    18 #include<iomanip>
    19 #include<cstdio>
    20 #include<cmath>
    21 #include<cstdlib>
    22 #include<cstring>
    23 #include<ctime>
    24 #define LL long long
    25 #define maxn 305
    26 using namespace std;
    27 int a[305];
    28 int ans[405];
    29 int sum[405];
    30 int tmp[405];
    31 int ok(int k ,int n)
    32 {
    33     if(k ==  0)
    34         return 1;
    35     int tl = k /9 ; 
    36     int tt= (k % 9 ==0 ?0:1);
    37     if(tl + tt -1 <= n)
    38     {
    39       for(int i = 0 ;i <tl;i ++)
    40           tmp[i] = 9 ;
    41       tmp[tl] = k % 9;
    42       return 1;
    43     }
    44     return 0 ; 
    45 }
    46 void solve(int k)
    47 {
    48     memset(sum,0,sizeof(sum));
    49     for(int i = 400 ;i >= 0  ;i --)
    50     {
    51        sum[i] = sum[i+1]+ ans[i];
    52     }
    53     for(int i = 0 ;i <=  400 ;i ++)
    54     {
    55        int t = k - sum[i+1] ;
    56        if(ans[i] == 9 || t <= ans[i])
    57            continue;
    58        for(int  j = ans[i] + 1; j <= 9 ;j ++)
    59        {
    60            memset(tmp,0,sizeof(tmp));
    61            if(ok(t-j,i-1))
    62            {
    63               for(int s = i +1;s <= 400; s ++)
    64                   tmp[s] = ans[s];
    65               tmp[i] = j; 
    66               return ;
    67            }
    68        }
    69     }
    70 }
    71 int main(){
    72    int n ;
    73    scanf("%d",&n);
    74    for(int i = 1;i <= n;i ++)
    75    {
    76       scanf("%d",&a[i]);
    77       solve(a[i]) ;   
    78       int j;
    79       for(j = 400; j>= 0 ;j --)
    80       {
    81         if(tmp[j] != 0)
    82             break;
    83       }
    84       for(;j >= 0 ;j --)
    85           printf("%d",tmp[j]);
    86       printf("
    ");
    87       memcpy(ans,tmp,sizeof(tmp));
    88    }
    89 return 0;
    90 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    js 删除字符串中所有空格
    jquery easyui datagrid 设置设置在选中的所有行中只选择第一行
    编译Linux内核时出现错误gcc: error: elf_i386: No such file or directory
    AD9打印丝印层
    s3c2410 board.c分析
    2010.03 u-boot--Makefile完全分析
    mini6410移植--uboot移植(2)
    mini6410移植--uboot移植(1)
    uboot之uboot.lds文件分析
    Linux启动过程
  • 原文地址:https://www.cnblogs.com/zyue/p/4362185.html
Copyright © 2020-2023  润新知