标签:数据结构
还是优先队列问题,题目大意:路上有很多石头,当你遇到奇数序列的石头就把他向前仍,偶数的不动他,如果两个石头一起,先考虑可以仍的比较近的石头仍也就是比较大的石头,这样一直下去,直到前面所有的石头都不可以仍了为止。
其实就是将这个过程坐标化,Pi就是坐标,而Di就是有几个单位长度。
这里优先队列采用的还是自定义结构体的方法:
struct point { int dis,pos; friend bool operator <(point a,point b) { if(a.pos==b.pos) return a.dis>b.dis; return a.pos>b.pos; } };同样,题目中有“如果两个石头一起,先考虑可以仍的比较近的石头仍也就是比较大的石头“,所以应该有if(a.pos==b.pos) return a.dis>b.dis;
至于return 语句里面的‘<’和‘>’的判断,具体要这么用,这里可以有个简单总结记忆:
当是最大优先队列的时候,即用符号<作比较:
当是最小优先队列的时候,即用符号>作比较。
本题中距离和位置都是较小优先,所以两处return语句都用<;
全代码如下:
#include <stdio.h> #include <string.h> #include <queue> using namespace std; struct point { int dis,pos; friend bool operator <(point a,point b) { if(a.pos==b.pos) return a.dis>b.dis; return a.pos>b.pos; } }t; int main() { int i,n,m,p,d; scanf("%d",&m); priority_queue<point>q; while(m--) { scanf("%d",&n); while(!q.empty()) q.pop(); for(i=0;i<n;i++) { scanf("%d%d",&t.pos,&t.dis); q.push(t); } int ans=0,count=1; //point p; while(!q.empty()) { if(count&1) { t=q.top(); q.pop(); t.pos+=t.dis; ans=t.pos; q.push(t); } else q.pop(); count++; } printf("%d\n",q.top().pos); } return 0; }
标签:数据结构
原文地址:http://blog.csdn.net/u013068502/article/details/38337951