2 条题解
-
2
第一次写题解不是特别会,求指点
整体思路
这是一道贪心题,过程: 1.贪什么:最后一次奖励下发的时间最小。
2.怎么贪:将每个任务的b进行排序,越大的越前(在等待奖励下发时,可以继续完成其他任务),实现时间的完美利用(我是这么理解的)
3. 为何贪(证明): 假设两个相邻的任务等待的时长为bx和by,若bx>by,那么将x放在y前面则为优,所以可得所有任务按b进行降序排列为最优解。
具体代码怎么做呢
可以用到pair捆绑结构体或自定义结构体 我分享一个结构体解法:
(pair我不熟悉)1.定义一个结构体,包含a,b2.写一个判断函数,以便sort排序用(大致的内容上面有提到)
3.排序后遍历,将时间总和算出,以及奖励派送时间(结果)
AC代码
#include <bits/stdc++.h> using namespace std; struct Node{ long long a,b; };//第i个任务的时间(a)以及完成后所需等待的时间(b) bool cmp(Node x,Node y){ return x.b > y.b; } //按照b从大到小排序 Node s[200005]; long long n,sum,ans;//防止数据很大,开long long int main() { ios::sync_with_stdio(false); cin.tie(0); //加速,也能用scanf、printf cin >> n; for(int i=1;i<=n;i++){ cin >> s[i].a >> s[i].b; }//输入 (从1开始遍历) sort(s+1,s+n+1,cmp); //将数组排序 for(int i=1;i<=n;i++){ sum += s[i].a; //将n个任务花的时间加起来 ans = max(ans,s[i].b+sum); //用等待时间加上完成时间算出奖励派送的时间,再对比并迭代一下 } cout << ans;//输出 return 0; }代码仅供参考,不一定最优
- 1
信息
- ID
- 238
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 7
- 已通过
- 2
- 上传者