BZOJ4230 倒计时

1|0BZOJ4230 倒计时

Link

1|1题目分析:

可以说是数一数二了。首先一个比较显然的性质是肯定是每一次都选最大的肯定是最优秀的。所以我们就每次只去选择前面的最大值减去。具体来说我们可以这样进行 DP,我们对于当前的这一位,可以把后面看成 000000x 的形式,然后我们需要减去一个数然后变成 999999y 这样的形式,所以我们在算某一位的时候,先递归处理更低的位数,然后就相当于后面都是 0 的这种形式了。于是乎直接进行模拟即可。

具体的实现,设 f[mx][len][u] 表示前面的最大位是 mx, 处理的长度是 lenu 也就是相当 y,当 u=10 的时候是原数。当然我们还需要另外一个 g 数组来进行辅助转移,用来记录前面减去的剩下的值。具体见代码。

1|2Code:

//editor : DRYAYST //Wo shi ge da SHA BI #include<bits/stdc++.h> #define g() getchar() #define il inline #define ull unsigned long long #define eps 1e-10 #define ll long long #define pa pair<int, int> #define for_1(i, n) for(int i = 1; i <= (n); ++i) #define for_0(i, n) for(int i = 0; i < (n); ++i) #define for_xy(i, x, y) for(int i = (x); i <= (y); ++i) #define for_yx(i, y, x) for(int i = (y); i >= (x); --i) #define for_edge(i, x) for(int i = head[x]; i; i = nxt[i]) #define int long long #define DB double #define ls (p<<1) #define rs (p<<1|1) #define m_p make_pair #define fi first #define se second using namespace std; const int N = 1e6 + 10, INF = 0x7f7f7f7f, mod = 1e9 + 7; il int qpow(int x, int k) {int ans = 1; while(k) {if(k & 1) ans = ans * x % mod; x = x * x % mod; k >>= 1; } return ans; } il int Add(int x, int y) {return (x += y) %= mod;} il int Del(int x, int y) {return (x = x - y + mod) % mod;} il int Mul(int x, int y) {return x * y % mod;} il int inv(int x) {return qpow(x, mod - 2); } inline int re() { int x = 0, p = 1; char ch = getchar(); while(ch > '9' || ch < '0') {if(ch == '-') p = -1; ch = getchar();} while(ch <= '9' and ch >= '0') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();} return x * p; } int pw[1100], a[20], f[20][20][20], g[20][20][20]; int n, cnt; void dfs(int mx, int len, int u, int n) {//n 是当前的值 // cout<<"mx = "<<mx<<" len = "<<len<<" u = "<<u<<" n = "<<n<<endl; if(f[mx][len][u] || g[mx][len][u]) return; if(len == 1) { if(!n || mx > n) f[mx][len][u] = 0, g[mx][len][u] = n; else f[mx][len][u] = 1, g[mx][len][u] = 0; return ; } int tmx = mx, tl = len - 1, tu = u, tn = n % pw[tl]; int ret = (u == 10) ? a[len] : 9; for(int i = ret; i >= 0; --i) { tmx = max(mx, i); dfs(tmx, tl, tu, tn); f[mx][len][u] += f[tmx][tl][tu]; tn = i * pw[tl] + g[tmx][tl][tu]; if(i != 0) {tu = 10 + g[tmx][tl][tu] - tmx; tn = tn - tmx; tn = tn % pw[tl]; f[mx][len][u]++; }//这里描述的是那个过程 else g[mx][len][u] = g[tmx][tl][tu]; } } signed main() { freopen("countdown.in","r",stdin); freopen("countdown.out","w",stdout); n = re(); pw[0] = 1; for_1(i, 18) pw[i] = pw[i - 1] * 10; if(n == 0) {cout<<"0"<<endl; return 0;} int tmp = n; while(tmp) a[++cnt] = tmp % 10, tmp /= 10; dfs(0, cnt, 10, n); cout<<f[0][cnt][10]<<endl; }

__EOF__

本文作者Zwaire
本文链接https://www.cnblogs.com/Zwaire/p/16137680.html
关于博主:这个世界除了你,都知道我喜欢你
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Zwaire  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示