题解
【基础】接水问题
2 条题解
-
0
/* 【解题思路:排队接水——谁先空出来,谁就接新人】 小朋友们,这道题和我们之前做的“排队打水”有一点小小的不同: 之前那道题是大家可以【自由选队】,所以动作快的人先排队; 而这道题是【初始顺序已经固定了】,每个人必须按照 1 到 n 的顺序乖乖去接水。 怎么模拟这个过程呢?我们可以把 m 个水龙头想象成 m 个“正在倒计时的沙漏”(也就是数组 a[1] 到 a[m]): 1. **初始状态**:最开始,前 m 个同学各占一个水龙头。 2. **接力游戏**:从第 m+1 个同学开始,大家在后面排队。谁该上场呢? * 哪个水龙头前面的人【先接完】(也就是哪一个水龙头累计的水量最少,对应代码里的 `min`),排队的第一名就立刻冲过去接替他。 * 冲过去之后,这个水龙头就要【加上新同学的接水量】(`a[min] += x`),继续累计时间。 3. **最终时间**:当所有人都被分配完之后,哪个水龙头累计的接水时间最长(对应代码里的 `max`),就代表那个水龙头最后关闭,也就是所有人接完水的总时间! 我们通过维护一个大小为 m 的数组,每次都在 m 个水龙头里“找最小、加新值”,最后“找最大输出” */ #include <bits/stdc++.h> using namespace std; // a 数组用来记录 m 个水龙头各自累计的接水总时间(也就是当前水龙头什么时候会空出来) int n, m, a[110]; int main(){ int i, j, x, min; cin >> n >> m; // 输入总人数 n 和水龙头个数 m for(i = 1; i <= n; i++){ cin >> x; // 输入当前排队到的小朋友的接水量 // 在现有的 m 个水龙头里,寻找哪一个水龙头会最先空出来 min = 1; // 先假设第 1 个水龙头是最快空出来的 for(j = 2; j <= m; j++){ if(a[j] < a[min]){ min = j; // 如果发现了更早空出来的水龙头,就更新最快水龙头的编号 } } // 让当前排队的小朋友去这个最先空出来的 `min` 号水龙头接水 // 这个水龙头结束工作的时间就要往后延长 x 秒 a[min] += x; } // 所有人都上场接完水了,现在我们要看哪个水龙头坚持到了最后 int max = a[1]; for(i = 2; i <= m; i++){ if(a[i] > max){ max = a[i]; // 找出累计时间最长的那个水龙头 } } // 输出最大时间,就是整个水房所有人接完水的总时间 cout << max << endl; return 0; } -
0
#include <bits/stdc++.h> using namespace std; int n,m,a[110]; int main(){ int i,j,x,min; cin>>n>>m; for(i = 1;i <= n;i++){ cin>>x; min = 1; //m个水龙头找最小值存入 for(j = 2;j <= m;j++){ if(a[j] < a[min]){ min = j; } } a[min] += x; } //找最大值 int max = a[1]; for(i = 2;i <= m;i++){ if(a[i] > max){ max = a[i]; } } cout<<max<<endl; }
- 1