贪心+优先队列之更改优先级-hdu1896
Posted ljhaha
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心+优先队列之更改优先级-hdu1896相关的知识,希望对你有一定的参考价值。
题目描述:
题目理解:
Sempr从位置0往前走,一路上他会遇到石子,如果这颗石子是他遇到的第奇数颗石子,那么他就把石子往前扔出去,如果他遇到的是第偶数颗石子,他会把它留在原地。需要注意的是,Sempr前面扔出去的石子,会继续作为后续会遇到的石子。如果在一个位置上有多颗石子,那么选出扔的最远的那颗石子扔出去。
比如说第一个测试案例:Sempr在位置1遇到了第一颗石子,他将石子扔到了1+5=6的位置上。Sempr继续往前走,在位置2上遇到第二颗石子,他将其留在原地,并且继续往前走。当Sempr走到位置6时,他遇到了第三颗石子(这颗石子是由位置1的第一颗石子扔到这儿的),他将这颗石子扔到了6+5=11的位置上,并继续往前走。当Sempr走到位置11时,他遇到第四颗石子,他将其留在原地。至此,该测试案例中的石子就扔完了。所以最终的结果为11。
这道题由于运用到了优先队列,并且在同一个位置有多颗石子时需要更改队列的优先级,所以自己去了解了一下关于优先级修改的相关操作。
C/C++对bool operator < (const p &a)const的认识:http://www.cnblogs.com/ECJTUACM-873284962/p/6771262.html
结构体内嵌比较函数:http://www.cnblogs.com/ZERO-/p/9347296.html
代码分析:
#include <iostream> #include <queue> #include <cstdio> using namespace std; struct stone { int d; int w; bool operator <(const stone &a)const//operator为C++里面的重载函数;括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改! { if(a.d==d)//如果石子的位置与队列中其他石子的位置一样 return a.w<w;//在优先队列中,排序方式与sort函数相反,即默认的排序方式是a.w>w,当前对象的w如果大于其他元素的w(即a.w),那么w的优先级更高 return a.d<d;//否则,位置靠前的优先级高 } }z; int main() { int t; scanf("%d",&t); while(t--) { priority_queue<stone>q; int n; scanf("%d",&n); while(n--) { scanf("%d %d",&z.d,&z.w); q.push(z); } int i=1; while(i) { if(i%2==1)//如果遇到的石头为第奇数颗,扔出去,并将该石子存入队列 { z=q.top(); q.pop(); z.d+=z.w; q.push(z); if(q.size()==1)//如果队列中只还剩下1个元素,取出来后退出。 { printf("%d ",q.top().d); break; } } else//如果遇到的石头为第偶数颗,不理它 { q.pop(); } i++; } } return 0; }
以上是关于贪心+优先队列之更改优先级-hdu1896的主要内容,如果未能解决你的问题,请参考以下文章