第十四届蓝桥杯青少组C++选拔赛[2022.11.27]第二部分编程题(3、业务办理时间)
参考程序:
#include <bits/stdc++.h>
using namespace std;int main() {int N;cin >> N; // 输入客户数量vector<int> t(N+1);for (int i = 1; i <= N; ++i) cin >> t[i]; // 每个客户需要的时间// 三个窗口的累加器(分别记录三个窗口的总时间)int total[4] = {0, 0, 0, 0};// 三个窗口的计数器(表示窗口什么时候空)int timeFree[4] = {0, 0, 0, 0};// 先把第1、2、3个客户分配给窗口1、2、3int next = 1;for (int i = 1; i <= 3 && next <= N; i++, next++) {total[i] += t[next]; // 累加总时间timeFree[i] = t[next]; // 这个窗口什么时候能空}// 从第4个客户开始,按规则分配while (next <= N) {// 找最先空出来的窗口int idx = 1;for (int i = 2; i <= 3; i++) {if (timeFree[i] < timeFree[idx]) idx = i; // 谁空得早,选谁else if (timeFree[i] == timeFree[idx] && i < idx) idx = i; // 时间相同,选编号小的}// 把下一个客户分配到这个窗口total[idx] += t[next]; // 累加该窗口的总时间timeFree[idx] += t[next]; // 更新该窗口空闲的时间点next++; // 下一个客户}// 三个窗口总时间里,取最小的int ans = min({total[1], total[2], total[3]});cout << ans << "\n";return 0;
}
参考程序2:
#include <iostream>
using namespace std;int main() {int n; // 总人数cin >> n;int times[100]; // 每个人需要的办理时间for (int i = 0; i < n; i++) cin >> times[i];// 三个窗口的“结束时间”,初始都是 0int w1 = 0, w2 = 0, w3 = 0;// 三个窗口的累计工作总时间int sum1 = 0, sum2 = 0, sum3 = 0;for (int i = 0; i < n; i++) {int t = times[i]; // 当前这个人需要的时间// 找到最早空出来的窗口if (w1 <= w2 && w1 <= w3) {w1 += t; // 窗口1结束时间往后推sum1 += t; // 累加窗口1的工作量}else if (w2 <= w1 && w2 <= w3) {w2 += t;sum2 += t;}else {w3 += t;sum3 += t;}}// 输出三个窗口中最小的总工作量int ans = min(sum1, min(sum2, sum3));cout << ans << endl;return 0;
}