题解:
可以先将偶数位置设定为自己选取,奇数位置为对方选取。然后,我们发现,第i位,可以与之后(i到n)的一个对方选取的物品进行交换,交换之后还满足之前的性质。那么这个过程可以用线段树或者multiset之类的完成。
当然,也可以用优先队列什么的乱搞,倒着模拟。
思考:
就是事先分好,按你一次我一次的顺序取物体,然后我要取的物体和你还未取的物体互换,使自己获得的利益最大。
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<iterator>
#include<queue>
#include<vector>
#include<string>
using namespace std;
typedef long long ll;
const int N=1e6+10;
const long long INF=1e18;
const double eps=0.0000001;
ll a[N];
struct node{
ll id,val;
}h;
struct cmp
{
bool operator()(const node &a,const node &b)
{
if(a.val==b.val)
{
return a.id>b.id;
}
return a.val<b.val;
}
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
priority_queue<node,vector<node>,cmp>Q;
ll ans=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=n;i>=1;i--)
{
if(i%2==0)
{
if(!Q.empty()&&Q.top().val>a[i])
{
h=Q.top();
Q.pop();
swap(h.val,a[i]);//交换数据
Q.push(h);
}
ans+=a[i];//统计我方的数据
}
else
{
h.id=i;
h.val=a[i];
Q.push(h);
}
}
cout<<ans<<"\n";
}