【杭电】[1896]Stones
像这种题都是理解题目难
真理清思路之后写的时候可能很简单就AC了……
这个利用优先队列做比较方便
题目大意是
遇见第奇数次石子就向前扔di米
遇见第偶数次石子就忽略
这样一直进行直到遇不见石子
问最远的石子距离出发点有多远
(总是从1出发)
这里是一个不断把石子加入队列的过程
直到队列为空(前方没有石子)
运用优先队列可以方便的按照
优先Pi再看Di的方式来取石子
#include<stdio.h>
#include<queue>
using namespace std;
struct node {
int p,d;
bool friend operator<(node A,node B) {
if(A.p==B.p)
return A.d>B.d;
else
return A.p>B.p;
}
} a;
int main() {
int T;
scanf("%d",&T);
while(T--) {
priority_queue<node>q;
int n;
scanf("%d",&n);
while(n--) {
scanf("%d %d",&a.p,&a.d);
q.push(a);
}
int time=0,flag=0;
while(!q.empty()) {
time++;
if(time&1) {
a=q.top();
a.p+=a.d;
if(a.p>flag)
flag=a.p;
q.push(a);
q.pop();
} else {
a=q.top();
if(a.p>flag)
flag=a.p;
q.pop();
}
}
printf("%d\n",flag);
}
return 0;
}
题目地址:【杭电】[1896]Stones