博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2020kickstart E round C Toys (优先队列)
阅读量:2148 次
发布时间:2019-04-30

本文共 1882 字,大约阅读时间需要 6 分钟。

题意:

有n个toy排成一个圈圈,每个toy有一个e[i],r[i],需要e[i]的时间去玩这个toy,r[i]可以理解为这个玩具再次可以被玩的cd时间,一个小孩会从第0个玩具开始,每次往i+1个玩具轮流玩过去,一个玩具可以被玩的前提是,距离上次被玩的时间超过r[i],当碰到不能玩的玩具后,小孩就会停下不动,否则一直玩下去。问移除多少个toy,可以让小孩玩的时间最长,并且再保证时间最长的情况下,移除最少的玩具。

 

思路:

第一轮肯定是都可以玩耍,关键是看第二轮,我们记完成一轮玩具的时间为tim,那么判断一个玩具再第二轮的时候是否可以玩就是判单tim-e[i]>=r[i],如果大于等于就是可以玩,小于就是不行。

然后这个问题最简单的思路其实就是第二轮的时候我们碰到不能玩的就移除,依次移除,但是有个问题,移除之后tim再变小,又会有更多的toy不能被玩,就需要第三轮删除,第四轮删除。这样就会变成一个n^2的算法,肯定不行。

然后值得注意的是,toy被删除的顺序其实不重要,因为r[i]>tim-e[i]就必须每个都要删除,所以我们删除的时候没必要按照玩的顺序去删除,而是直接找出满足t[i]>tim-e[i]的toy删除就行,不用管顺序。然后这时候我们就是要找当tim变化时,哪些toy变成满足r[i]>tim-e[i]了。但是这样很难直接找,就可以考虑转换一下不等式,变成找r[i]+e[i]>sum的出来删除,这样就很容易维护一个r[i]+e[i]的优先队列,我们只需要按顺序遍历toy,然后删除toy更新tim的时候,去优先队列里看top()的值是否大于新的tim就行,这样最多删除n次,时间复杂度就是o(nlogn)了,最后如果没有都被删除,就是可以无限时间玩下去。

 

代码:

#include 
#define ps push_backusing namespace std;const long long inf=1e18;const int maxn=1e5+5;int n;int e[maxn], r[maxn];long long ans;int num;struct node{ int x; int id; bool operator <(const node& a)const{ return x
>n; ans=0; priority_queue
q; for(int i=0; i
tim) { tim-=e[i]; cur_tim-=e[i]; cnt++; while(!q.empty() && q.top().x>tim) { tmp=q.top(); tim-=e[tmp.id]; cur_tim-=2*e[tmp.id]; q.pop(); cnt++; } } else { q.push(tmp); cur_tim+=e[i]; } if(cur_tim>max_tim) { num=cnt; max_tim=cur_tim; } } if(cnt!=n) { num=cnt; max_tim=inf; } if(max_tim!=inf)printf("%d %lld\n", num, max_tim); else printf("%d INDEFINITELY\n", num);}int main(){// ios::sync_with_stdio(0);// cin.tie(0); int t; cin>>t; for(int i=1; i<=t; i++){ cout<<"Case #"<
<<": "; solve(); } return 0;}

 

转载地址:http://qnywb.baihongyu.com/

你可能感兴趣的文章
走进JavaWeb技术世界13:Hibernate入门经典与注解式开发
查看>>
走进JavaWeb技术世界14:Mybatis入门
查看>>
走进JavaWeb技术世界16:极简配置的SpringBoot
查看>>
初探Java设计模式1:创建型模式(工厂,单例等)
查看>>
初探Java设计模式2:结构型模式(代理模式,适配器模式等)
查看>>
初探Java设计模式3:行为型模式(策略,观察者等)
查看>>
初探Java设计模式4:一文带你掌握JDK中的设计模式
查看>>
初探Java设计模式5:一文了解Spring涉及到的9种设计模式
查看>>
Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理
查看>>
Java集合详解2:一文读懂Queue和LinkedList
查看>>
Java集合详解3:一文读懂Iterator,fail-fast机制与比较器
查看>>
Java集合详解4:一文读懂HashMap和HashTable的区别以及常见面试题
查看>>
Java集合详解5:深入理解LinkedHashMap和LRU缓存
查看>>
Java集合详解6:这次,从头到尾带你解读Java中的红黑树
查看>>
Java集合详解7:一文搞清楚HashSet,TreeSet与LinkedHashSet的异同
查看>>
Java集合详解8:Java集合类细节精讲,细节决定成败
查看>>
Java并发指南1:并发基础与Java多线程
查看>>
Java并发指南2:深入理解Java内存模型JMM
查看>>
Java并发指南3:并发三大问题与volatile关键字,CAS操作
查看>>
Java并发指南4:Java中的锁 Lock和synchronized
查看>>