1 条题解
-
0
📝 题目大意
给定 种营养素的每日目标摄取量 ,以及 种食品中每种营养素含量 。判断将所有食品摄取的每种营养素分别求和后,是否每种营养素都达到了目标摄取量。
💡 解题思路
-
题目分析:本质是对 个长度为 的数组按列求和,再逐列与目标值比较。数据范围 ,,总和最大为 ,仍在
int范围内(),无需使用long long。 -
算法推导:
- 首先读入 和 ,再读入
target数组(长度 ),即每种营养素的目标值。 - 建立一个长度为 且初始值全为 的
total数组,用于累加每种营养素的总摄入量。 - 遍历 种食品,对于每种食品,读入其 个营养素含量 ,并累加到
total[j]上。 - 最后遍历
total数组,检查是否存在某个营养素 满足total[j] < target[j]。若存在,则输出"No";若全部达标,则输出"Yes"。
- 首先读入 和 ,再读入
-
边界与细节:
- 或 为 时算法依然正确,无需特殊处理。
- 或 可能为 ,此时
total[j]也可能为 ,比较逻辑total[j] < target[j]依然正确。 - 由于 ,直接双重循环不会超时。
- 输入量较大时建议关闭同步流或使用
scanf,但本题数据较小,cin足够。
⏱️ 复杂度分析
- 时间复杂度:读入 个目标值 ,读入 个营养素值并累加 ,最后检查 个营养素 ,总体为 。
- 空间复杂度:
target数组和total数组各占用 空间,读入的 为临时变量,总体为 。
💻 标准代码 (C++)
#include <iostream> #include <vector> using namespace std; int main() { int N, M; cin >> N >> M; // 读入每种营养素的目标摄取量 vector<int> target(M); for (int i = 0; i < M; i++) { cin >> target[i]; } // total[j] 表示第 j 种营养素的总摄入量,初始为 0 vector<int> total(M, 0); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { int x; cin >> x; // 第 i 种食品中第 j 种营养素的含量 total[j] += x; // 累加到总摄入量 } } // 检查是否每种营养素都达标 bool ok = true; for (int j = 0; j < M; j++) { if (total[j] < target[j]) { // 存在未达标的营养素 ok = false; break; } } cout << (ok ? "Yes" : "No") << endl; return 0; } -
- 1
信息
- ID
- 810
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者