C++实现戴夫后院抵御僵尸的植物选择策略
```cpp #include <iostream> #include <vector> #include <algorithm> #include <unordered_map> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int n; cin >> n; vector<int> s(n); for (int i = 0; i < n; i++) { cin >> s[i]; } vector<int> t(n); for (int i = 0; i < n; i++) { cin >> t[i]; } // 分离普通植物和特殊植物 vector<int> normal, special; for (int i = 0; i < n; i++) { if (t[i] == 0) { normal.push_back(s[i]); } else { special.push_back(s[i]); } } // 对普通植物排序 sort(normal.begin(), normal.end()); // 统计特殊植物的数量 int specialCount = special.size(); // 使用哈希表记录每个攻击力值 unordered_map<int, bool> exists; for (int val : normal) exists[val] = true; for (int val : special) exists[val] = true; // 贪心选择普通植物 int selectedNormal = 0; for (int val : normal) { bool canSelect = false; // 检查是否存在特殊植物 if (specialCount > 0) { canSelect = true; } // 检查是否存在其他植物满足整除条件 if (!canSelect) { // 检查是否存在已选的普通植物满足条件 for (int other : normal) { if (other == val) continue; if (exists[other] && (val % (other + 1) == 0)) { canSelect = true; break; } } } // 检查是否存在特殊植物满足条件 if (!canSelect) { for (int sp : special) { if (val % (sp + 1) == 0) { canSelect = true; break; } } } if (canSelect) { selectedNormal++; // 标记当前植物已被选择 exists[val] = true; } } // 特殊植物总是可以被选择 int result = specialCount + selectedNormal; cout << result << "\n"; } return 0; } ``` 代码说明: 1. 数据结构: - 使用`vector<int>`存储普通植物和特殊植物的攻击力 - 使用`unordered_map`记录存在的植物攻击力值 2. 算法逻辑: - 特殊植物(t=1)总是可以被选择 - 普通植物需要满足条件:存在已选植物j使得`s[i] % (s[j] + 1) == 0` - 采用贪心策略选择普通植物 3. 优化: - 对普通植物排序便于处理 - 使用哈希表快速检查植物是否存在 - 优先检查特殊植物是否满足条件 4. 时间复杂度: - 每组数据O(n²)最坏情况,适合n≤1000的数据规模 注意: 这是一个贪心解法,对于某些特殊测试用例可能不是最优解。如果数据规模更大或需要精确最优解,可能需要使用图论或动态规划方法。 ######[AI问答 | 773点数解答 | 2026-01-19 19:20:57]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- 超详细:JDK安装及Windows系统环境变量设置全攻略 (阿里通义 | 376点数解答 | 2024-03-06 17:27:29)352
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)310
- 2 秒动画搞定!“好句子”如何稳停结束位置( | 456点数解答 | 2024-05-19 16:46:15)274
- PHP实训:从0到1搭建电商平台,收获技能与成长!(讯飞星火 | 674点数解答 | 2024-06-17 08:58:32)346
- PHP实训:搭建电商平台的实战之旅与收获反思 (讯飞星火 | 623点数解答 | 2024-06-17 08:59:26)338
- PHP 实训:从零打造电子商务平台,解锁开发全流程!(GPT | 1439点数解答 | 2024-06-17 09:00:18)295
- PHP实训:搭建电子商务平台全流程揭秘与收获(GPT | 1868点数解答 | 2024-06-17 09:02:00)286
- C++ 求解:最少操作次数让字符串无子串 “friend” (字节豆包 | 153点数解答 | 2024-08-17 16:29:54)478
- C++ 求解:最少操作次数让字符串不再含 “friend” 子串!(讯飞星火 | 260点数解答 | 2024-08-17 16:30:49)464
- Python 巧解:最少操作次数让字符串告别“friend”子串(字节豆包 | 139点数解答 | 2024-08-18 13:04:14)401
- PHP 搭建超实用电子商务平台:含商品展示、购物车与结算功能及优化要点(字节豆包 | 1455点数解答 | 2025-06-04 09:15:29)108