P2392 kkksc03考前临时抱佛脚

 

昨天晚上看了题目没思路。 早上上课回来之后想着就直接根据题目搞一个左脑一个右脑,然后两边分别加时间取最大暴搜,结果T了九个,这是代码。

#include <iostream> using namespace std; int tAns, ans; int s[5], array[30]; bool is_use[30]; void preprocessing() { for (int i = 1; i <= 4; i++) { cin >> s[i]; } } void dfs(int step, int left, int right, int n) { int ans = max (left, right); if (ans >= tAns) { return; } if (step == n) { tAns = min(ans, tAns); } for (int i = 1; i <= n; i++) { if (!is_use[i]) { is_use[i] = true; dfs(step + 1, left + array[i], right, n); dfs(step + 1, left, right + array[i], n); is_use[i] = false; } } } void solve() { for (int i = 1; i <= 4; i++) { tAns = 0x7fffffff; for (int j = 1; j <= s[i]; j++) { cin >> array[j]; } dfs(0, 0, 0, s[i]); ans += tAns; } cout << ans; } int main() { preprocessing(); solve(); return 0; }

尝试了各种剪枝,还是过不了一点。

最后发现问题是这个循环。

for (int i = 1; i <= n; i++) { if (!is_use[i]) { is_use[i] = true; dfs(step + 1, left + array[i], right, n); dfs(step + 1, left, right + array[i], n); is_use[i] = false; } }

实际上无脑公式化套用了前面几道搜索题的做法,类似套模板,没有真的理解这道题的本质。

这道题left和right两个分别加上时间的做法任务就是试完n个,而不需要每一次都从1到n试。

具体的,对于每一个状态,只需从left和right中选择一个进入

对于这样一个问题,只要按顺序一个个试下去,每个都试left和right即可。

所以这段代码把循环去了就AC了。

#include <iostream> using namespace std; int tAns, ans; int s[5], array[30]; void preprocessing() { for (int i = 1; i <= 4; i++) { cin >> s[i]; } } void dfs(int step, int left, int right, int n) { int ans = max (left, right); if (ans >= tAns) { return; } if (step == n) { tAns = ans; return; } dfs(step + 1, left + array[step + 1], right, n); dfs(step + 1, left, right + array[step + 1], n); return; } void solve() { for (int i = 1; i <= 4; i++) { for (int j = 1; j <= s[i]; j++) { cin >> array[j]; } tAns = 0x7fffffff; dfs(0, 0, 0, s[i]); ans += tAns; } cout << ans; } int main() { preprocessing(); solve(); return 0; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17776968.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(23)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示