题目描述:
输入&输出:
现在给出代码:(记得点赞哟)
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>
typedef long long LL;
using namespace std;
int n;
struct node
{
int x, y;
bool operator <(const node &a)const{
return x == a.x ? y > a.y : x < a.x;
}
}a;
priority_queue<node> q;//优先队列维护最大值
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d %d", &a.x, &a.y);
q.push(a);
}
LL ans = -(1LL << 60), sum1 = 0, sum2 = 0;//注意ans的范围和初始化的值
int num = 0;
while(q.size()){
node t = q.top();
q.pop();
if(t.y > t.x) continue;//如果下面的牌比上面的大,不要选
if(num & 1){//小Y选择
sum2 += t.x;
ans = max(ans, sum1 - sum2);//一个轮回更新下差
}else{//小X选择
sum1 += t.x;
}
if(t.y != -1) t.x = t.y, t.y = -1, q.push(t);//如果选择了a[i],那么b[i]代替a[i],b[i]设为尽量小的值(<0)
num++;
}
ans = max(ans, sum1 - sum2);//有可能小Y没有选择,也要更新下值
printf("%lld\n", ans);
return 0;
}