用优先队列模拟就行了,只不过题意要理解好:当奇数次遇到石子时就丢石子,否则就弃石子。个人觉得题意描述得挺模糊的,容易让人石子的编号是奇数时丢石子。
代码如下:
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
struct stone
{
int p,d;
bool operator < (const stone& a) const
{
if(a.p!=p)
return p>a.p;
return d>a.d;
}
};
priority_queue<stone> pq;
int main()
{
int T,n;
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
stone a;
cin>>a.p>>a.d;
pq.push(a);
}//cout<<pq.size()<<endl;
int pos=0,ans=0,odd=1;
while(!pq.empty())
{
if(odd)
{
stone a=pq.top();
a.p+=a.d;
ans=max(a.p,ans);
odd=0;
pq.pop();
pq.push(a);
}
else
{
pq.pop();
odd=1;
}
}
cout<<ans<<endl;
}
return 0;
}