CF95B Lucky Numbers [毒瘤分类讨论贪心/DFS] 思维题 贪心 题解 OI https://www.luogu.org/problemnew/show/CF95Bhttps://www.luogu.org/problemnew/show/CF95B 其实代码用不着这么多goto,不过写着方便~ 详细分析有时间再写吧 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 1e5+10;char a[MAXN],ans[MAXN];int n;int main(){ cin >> (a+1); int n = strlen(a+1); if(n & 1){ODD_N: for(int i = 1;i<=n/2 + 1;i++){ putchar('4'); } for(int i = 1;i<=n/2 + 1;i++){ putchar('7'); } putchar('\n'); }else{ int lead4 = 0,lead7 = 0,now = 1; while(now <= n){ if(a[now] < '4'){ break; }else if(a[now] == '4' && lead4 < n/2){ ans[now] = '4'; lead4++; now++; }else if(a[now] < '7' && lead7 < n/2){ ans[now] = '7'; lead7++; break; }else if(a[now] == '7' && lead7 < n/2){ ans[now] = '7'; lead7++; now++; }else{ goto TRY_LAST_USE_7; } } if(false){TRY_LAST_USE_7: while(--now){ if(ans[now] == '4'){ lead4--; }else{ lead7--; } if(ans[now] < '7' && lead7 < n/2){ ans[now] = '7'; lead7++; goto OUTPUT; } } goto ODD_N; }OUTPUT: for(int i = 1;i<=lead4 + lead7;i++){ putchar(ans[i]); } for(int i = 1;i<=n/2 - lead4;i++){ putchar('4'); } for(int i = 1;i<=n/2 - lead7;i++){ putchar('7'); } putchar('\n'); }}