HDU - 4221 贪心
2024-09-02 10:44:01
题意:
你有n个任务,每一个任务有一个完成所需时间AI,和一个截止时间BI。时间从0开始,如果完成任务的时间(设这个时间为ans)大于BI那么就会收到ans-BI的惩罚,问你完成所有这些任务你会收到的最大惩罚是多少。让你求这个惩罚的最小值
题解:
刚开始以为让找的是完成每一个任务所受惩罚的和的最小值。最后才发现题意读错了。。。
假设有两个任务,一个任务为a1,b1,另一个任务是a2,b2.且b2>b1,起始时间为tmp
那么如果先完成第一个任务耗时最大值为max(tmp+a1+a2-b2,tmp+a1-d1)
如果先完成第二个任务耗时最大值为max(tmp+a2+a1-d1,tmp+a2-d2)>max(tmp+a1+a2-b2,tmp+a1-d1)
代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<math.h>
6 #include<vector>
7 #include<queue>
8 #include<stack>
9 #include<map>
10 using namespace std;
11 typedef long long LL;
12 const int maxn=505;
13 //const LL MAX=1e15;
14 const int INF=0x3f3f3f3f;
15 const double eps=1e-8;
16 const double PI=3.1415926;
17 const int mod = 1e9+7;
18 const int MAX=100000+10;
19 struct Time
20 {
21 LL s,e;
22 } T[MAX];
23 bool cmp(Time a,Time b)
24 {
25 return a.e<b.e;
26 }
27 int main()
28 {
29 LL cas,i,n,tag=1;
30 LL ans;
31 cin>>cas;
32 while(cas--)
33 {
34 scanf("%I64d",&n);
35 for(i=0; i<n; i++)
36 scanf("%I64d%I64d",&T[i].s,&T[i].e);
37
38 sort(T,T+n,cmp);
39 ans=0;
40 LL tmp=0;
41 for(i=0; i<n; i++)
42 {
43 tmp+=T[i].s;
44 if(tmp-T[i].e>ans)
45 ans=tmp-T[i].e;
46 }
47 printf("Case %I64d: %I64d\n",tag++,ans);
48 }
49 return 0;
50 }
最新文章
- Java多线程开发系列之一:走进多线程
- Leetcode#138 Copy List with Random Pointer
- [Gauss]POJ1753 Flip Game
- Linux字符设备与块设备的区别与比较
- SQL 创建存储过程,让主键自增
- 云计算-openstack基础构架以及服务方式详解
- 【java系列】java开发环境搭建
- iOS 社交化分享功能
- PHP实现微信模板消息发送给指定用户
- eclipse创建的maven项目,pom.xml文件报错解决方法
- MAC终端如何使用rar和unrar
- Swift Realm 完整使用记录
- .svn文件夹特别大
- Es6数值拓展
- sso cas4.0改造历程--spring-webflow篇
- Java学习笔记30(集合框架四:List接口)
- linux中cut、printf、awk、sed命令
- 岭回归、LASSO与LAR的几何意义
- 【oracle】一些的常用命令
- 7.6 服务远程暴露 - 注册服务到zookeeper