标签:
题意
有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 }
标签:
原文地址:http://www.cnblogs.com/md-zz/p/5855358.html