POJ-3616-Milking Time
来源:互联网 发布:淘宝出售假冒商品2次 编辑:程序博客网 时间:2024/05/01 23:07
这个题的意思是说要对一些奶牛进行挤牛奶操作,每个奶牛挤牛奶的时间是一段区间,若开始挤牛奶那么就必须在整个区间对这头奶牛挤牛奶,然后每挤完一头奶牛那么需要强制休息r分钟,然后对于每头奶牛挤奶可以得到一定的值,问在n的时间内对这些奶牛进行挤奶操作,可以得到的最大的值是多少。
思路:
1、对于强制休息我们对每头奶牛挤奶的结束时间都加上r。
2、个人觉得这个题应该属于贪心,按结束时间早晚进行排序,然后对于每头奶牛挤奶操作,在这头奶牛挤奶开始时间之前选择最大的收益值,然后加上这个奶牛的收益值,再对这个奶牛结束点后面的点进行更新操作,在这里我用的树状数组进行更新操作。剩下的就比较简单了
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=2000;const int maxm=1e6+1000;struct Node{ int l; int r; int e; bool operator < (const Node &a)const {if(r==a.r) return l<a.l;return r<a.r; }}a[maxn];int n,m,r,t[maxm];int lowbit(int x){ return x&(-x);}int Sum(int x){ int ans=0; while(x>0) {ans=max(ans,t[x]);x-=lowbit(x); } return ans;}void Update(int x,int val){ for(int i=x;i<maxm;i+=lowbit(i))t[i]=max(t[i],val);}int main(){ while(scanf("%d%d%d",&n,&m,&r)!=EOF) {memset(t,0,sizeof(t));for(int i=0;i<m;i++){ scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].e); a[i].r+=r;}sort(a,a+m);int ans=0;for(int i=0;i<m;i++){ int sum=Sum(a[i].l); ans=max(sum+a[i].e,ans); Update(a[i].r,a[i].e+sum);}printf("%d\n",ans); } return 0;}
0 0
- poj 3616 Milking Time
- POJ 3616 Milking Time
- POJ-3616-Milking Time
- poj 3616 Milking Time
- POJ 3616 Milking Time
- poj 3616 Milking Time
- Milking Time.(POJ-3616)
- POJ 3616 Milking Time
- POJ 3616 Milking Time
- POJ 3616 Milking Time
- POJ 3616 (milking time)
- POJ 3616 Milking Time
- POJ 3616 Milking Time
- poj 3616 Milking Time
- POJ 3616 Milking Time
- POJ 3616 Milking Time
- poj 3616 Milking Time
- POJ 3616 Milking Time
- WordPress网站迁移
- 磁道信息
- 类对象和类指针的区别
- 刚才小试一下,没把我吓死----30秒清除你电脑中的垃圾(使你电脑急速如飞)
- ibatis 无效字符
- POJ-3616-Milking Time
- delete from tablename与drop table tablename区别
- centos6.3安装mongodb2.2.4
- 使用ADO.NET自定义类MyDBase连接SQL Server数据库
- MySQL C语言API编程教程
- http错误大全
- 浙江大学ACM俱乐部 1031:时钟
- openlldp-0.4alpha实现详解(五)——tx_sm模块
- Access笔记