题意:给你一个数列 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 }