题意:奇数石头扔出去, 偶数石头忽略,相同位置的石头,先选择沉的,即能扔的距离比较近的。直到忽略最后一个为止,看一共走了多远。
思路:建一个优先队列,装进所有的元素,偶数石头pop掉,直到队列为空为止。
#include<iostream>
#include<queue>
using namespace std;
#define max 100000
struct stone{
int pos, dis;
bool operator < (const stone &a) const{
if(pos==a.pos)//先比较位置,位置一样比较距离。
return dis>a.dis;
return pos>a.pos;
}
};
struct stone a[max], b;
int main(){
priority_queue<stone> q;
int T, n;
cin>>T;
while(T--){
int cnt=0, maxDis=0;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i].pos>>a[i].dis;
q.push(a[i]);
}
while(!q.empty())
{
maxDis=q.top().pos;
if(++cnt % 2 ==0)
q.pop();
else
{
b=q.top();//奇数时,一定要先取出来,编辑完再放进去。
q.pop();
b.pos+=b.dis;
q.push(b);
}
}
cout<<maxDis<<endl;
}
return 0;
}
本人语拙,不懂地方,尽请留言,如有不足,不吝赐教。