Splitting Items
爱丽丝和鲍勃有 nn 件物品想要分配,所以他们决定玩一个游戏。所有物品都有一个成本,第 ii 件物品的成本是 aiai。玩家轮流行动,从爱丽丝开始。
在每一轮中,玩家选择剩下的物品之一并将其拿走。游戏一直进行,直到没有物品剩下。
假设 AA 是爱丽丝所拿物品的总成本,BB 是鲍勃所拿物品的总成本。那么游戏的最终 得分 将等于 A−BA−B。
爱丽丝想要最大化得分,而鲍勃想要最小化得分。爱丽丝和鲍勃都会采取最优策略。
但是游戏将在明天进行,所以今天鲍勃可以稍微修改成本。他可以将几个(可能是没有或全部)物品的成本 aiai 增加一个整数值(可能是相同的值或每个物品不同的值)。然而,总的增加必须小于或等于 kk。否则,爱丽丝可能会怀疑什么。请注意,鲍勃 不能降低 成本,只能增加。
鲍勃能达到的最低可能得分是多少?
输入
第一行包含一个整数 tt (1≤t≤50001≤t≤5000) — 测试用例的数量。接下来有 tt 个案例。
每个测试用例的第一行包含两个整数 nn 和 kk (2≤n≤2⋅1052≤n≤2⋅105; 0≤k≤1090≤k≤109) — 物品的数量和鲍勃可以进行的最大总增加。
每个测试用例的第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an (1≤ai≤1091≤ai≤109) — 物品的初始成本。
保证所有测试用例的 nn 之和不超过 2⋅1052⋅105。
输出
对于每个测试用例,打印一个整数 — 鲍勃在增加了几个(可能是没有或全部)物品的成本后,最低可能得分 A−BA−B。
示例
Inputcopy | Outputcopy |
---|---|
4 2 5 1 10 3 0 10 15 12 4 6 3 1 2 4 2 4 6 9 | 4 13 0 0 |
注意
在第一个测试用例中,鲍勃可以将 a1a1 增加 55,使得成本变为 [6,10][6,10]。明天,爱丽丝将拿走 1010,鲍勃将拿走 66。总得分将等于 10−6=410−6=4,这是最低可能的得分。
在第二个测试用例中,鲍勃不能改变成本。因此得分将等于 (15+10)−12=13(15+10)−12=13,因为爱丽丝将拿走 1515,鲍勃将拿走 1212,而爱丽丝 — 1010。
在第三个测试用例中,鲍勃例如可以将 a1a1 增加 11,a2a2 增加 33,a3a3 增加 22。总变化等于 1+3+2≤61+3+2≤6,成本将变为 [4,4,4,4][4,4,4,4]。显然,得分将等于 (4+4)−(4+4)=0(4+4)−(4+4)=0。
在第四个测试用例中,鲍勃可以将 a1a1 增加 33,使得成本变为 [9,9][9,9]。得分将等于 9−9=09−9=0。
//因为两人每次都是一定拿最大的那个数,所以把数字按从大到小排序过后,每次只需要再Bob拿的时候,将Bob要拿的数加到不大于前一个数直到m为0或者数拿完了
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
int a[N];
signed main(){int t;cin>>t;while(t--){int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+1+n,greater<int>());for(int i=2;i<=n;i+=2){if(m<=0)break;int h=a[i-1]-a[i];if(h<m){a[i]+=h;m-=h;}else{a[i]+=m;m=0;}}int num=0,num1=0;int g=1;for(int i=1;i<=n;i++){if(g%2==1){num+=a[i];}else{num1+=a[i];}g++;}int v=num-num1;cout<<v<<endl;}}