1. 程式人生 > >CodeForces 509C Sums of Digits(貪心亂搞)題解

CodeForces 509C Sums of Digits(貪心亂搞)題解

方式 can sin 大於 main sum void ostream printf

題意:a是嚴格遞增數列,bi是ai每一位的和,告訴你b1~bn,問你怎樣搞才能讓an最小

思路:讓ai剛好大於ai-1弄出來的an最小。所以直接模擬貪心,如果當前位和前一個數的當前位一樣並且後面還能生成比前一個數大的數,那麽就和前一個數保持一致,否則當前位 = 前一個數當前位+ 1,後面的位數按照最小方式排列。如果排到最後每一位都和前面一個數一致,就把剩余的b從最小的一位一直加滿9。

代碼:

#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include
<vector> #include<string> #include<cstdio> #include<cstring> #include<sstream> #include<iostream> #include<algorithm> typedef long long ll; using namespace std; const int maxn = 300 + 10; const int MOD = 1e9 + 7; const int INF = 0x3f3f3f3f; int b[maxn], ans[maxn][maxn + 200
], cnt[maxn]; void solve1(int i){ cnt[i] = 0; while(b[i] > 9){ ans[i][cnt[i]++] = 9; b[i] -= 9; } ans[i][cnt[i]++] = b[i]; } int main(){ int n; scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%d", &b[i]); } solve1(
1); for(int i = 2; i <= n; i++){ if(b[i] - 9 * cnt[i - 1] > 0){ solve1(i); } else{ if(b[i] <= ans[i - 1][cnt[i - 1] - 1]){ cnt[i] = cnt[i - 1] + 1; ans[i][cnt[i] - 1] = 1; b[i]--; for(int j = 0; j < cnt[i] - 1; j++){ if(b[i] >= 9){ ans[i][j] = 9; b[i] -= 9; } else if(b[i] > 0){ ans[i][j] = b[i]; b[i] = 0; } else ans[i][j] = 0; } } else{ cnt[i] = cnt[i - 1]; for(int j = cnt[i] - 1; j >= 0; j--){ if(j != 0){ if(b[i] - ans[i - 1][j] <= ans[i - 1][j - 1]){ ans[i][j] = ans[i - 1][j] + 1; b[i] -= ans[i][j]; while(ans[i][j] > 9){ b[i] += ans[i][j] - 1; j++; if(j == cnt[i]){ ans[i][j] = 0; cnt[i]++; } ans[i][j]++; } for(int k = 0; k < j; k++){ if(b[i] >= 9){ ans[i][k] = 9; b[i] -= 9; } else if(b[i] > 0){ ans[i][k] = b[i]; b[i] = 0; } else ans[i][k] = 0; } break; } else{ ans[i][j] = ans[i - 1][j]; b[i] -= ans[i][j]; } } else{ ans[i][j] = ans[i - 1][j]; b[i] -= ans[i][j]; } } if(b[i] > 0){ for(int j = 0; j < cnt[i] && b[i] > 0; j++){ if(b[i] > 9 - ans[i][j]){ b[i] -= 9 - ans[i][j]; ans[i][j] = 9; } else{ ans[i][j] += b[i]; b[i] = 0; } } } } } } for(int i = 1; i <= n; i++){ for(int j = cnt[i] - 1; j >= 0; j--) printf("%d", ans[i][j]); printf("\n"); } return 0; }

CodeForces 509C Sums of Digits(貪心亂搞)題解