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
没有梦想,何谈远方
原文地址:https://www.cnblogs.com/zyue/p/4362185.html