UVA

来源:互联网 发布:国外聊天软件 编辑:程序博客网 时间:2024/06/09 19:49


上面的是2种情况的示意图,在"解释"中会解释

/*思路:贪心难度:一开始不太理解,画图以后发现并不难解释:按照这个图,首先需要明确的是,吩咐指令的时间肯定是连起来的,吩咐完一个人,立刻就去吩咐下一个人,这点,可见图中粉色和蓝色的区域,我自己画图时没有完全对齐,但其实表示的意思就是,吩咐指令的行为之间,是没有时间间隔的至于ans的更新,可以分为两种情况1. 相比于第 i 个任务而言,第 (i+1) 个任务的完成时间确实更晚(这个完成时间,考虑了2者开始时间、吩咐时间和执行时间的不同,也就是说,比较的就是在数轴上画出的最终时间)体现在图中,就是棕色框的右边界在紫色框右边界的右边此时 ans 需要更新2. 相比于第 i 个任务而言,第 (i + 1)个任务反而更早全部完成也就是说,第 (i + 1) 个任务所用时间,相当于是已经被第 i 个任务的持续时间完全覆盖了,而第 i 个任务的持续时间,我们又在上一个循环中判断过了,该更新的也早就更新了因而,此时的 ans 不需要更新启发:其实看着感觉比较难,但分情况画个图,发现其实也并不难...*/ 

#include <iostream>#include <algorithm>#define rep(i, k, n) for (int i = k; i < (n); i++)using namespace std;const int N = 1e4 + 5;struct soilder{int B, J; //分别为吩咐指令用时,和执行任务用时 }s[N];bool mycmp(soilder a, soilder b){return a.J > b.J; //将执行所需时间更久的排前面 }int n;int main(){int kase = 0;while (cin >> n && n){rep(i, 0, n)cin >> s[i].B >> s[i].J;sort(s, s + n, mycmp);int ans = 0, tmp = 0;//ans用来计所有用时//tmp用来累计吩咐指令用时 rep(i, 0, n){tmp += s[i].B;ans = max(ans, tmp + s[i].J);}cout << "Case " << ++kase << ": " << ans << endl;}return 0;}



原创粉丝点击