首页 > 代码库 > UVa11729 - Commando War

UVa11729 - Commando War

题意

有n个士兵,每个士兵需要花b秒交代任务,j秒完成任务,现需选择交代任务的顺序,使整个任务花费时间最短。不能同时交代任务,但士兵可同时执行各自的任务。

思路

先排序,从执行时间最长的开始交代任务,然后贪心?仍旧不懂什么是贪心,书上写这是贪心,那就是贪心吧=。=

s+v[i].j是到第i个士兵的b的总和加上第i个士兵的j,再与之前的ans比较,取较大的赋值给ans

总结

C++还没系统的学习,对operator不是很了解,先搞明白大概的格式是什么样的就好啦,做题的时候就是卡在了怎么排序上,看了下训练指南上的代码,以后就会排结构体的大小顺序啦。

构造函数也不是很懂,一和vector在一起就不知道怎么传参了,先记住记住记住。

 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <algorithm> 5 using namespace std; 6 struct job 7 { 8     int b,j; 9     job(int m,int n):b(m),j(n){}10     bool operator < (const job &x) const {11         return j < x.j;12     }13 };14 int main()15 {16     int n,Case = 0;17     while(scanf("%d",&n)== 1 && n) {18         vector<job>v;19         int b,j;20         for(int i = 0; i < n; i++) {21             cin >> b >> j;22             v.push_back((job){b,j});23         }24         sort(v.begin(),v.end());25         reverse(v.begin(),v.end());26         int ans = 0,s = 0;27         for(int i = 0; i < n; i++) {28             s += v[i].b;29             ans = max(ans, s+v[i].j);30         }31         printf("Case %d: %d\n",++Case,ans);32     }33     return 0;34 }

 

 1 /*蓝书上是这么写的*/ 2 for(int i = 0; i < n; i++) { 3     cin >> b >> j; 4     v.push_back((job){b,j});   //这样写就不用写结构体中的构造函数了 5 } 6  7  8 //直接把 < 重载成 > ,这样sort时就直接是j从大到小的排列,不需要reverse函数了 9 bool operator < (const job &x) const {  10    return j > x.j;11 }

 

UVa11729 - Commando War