Description
一年一度的万圣节马上就要到了,弓箭手小明和剑士小刚约好一起去猎杀幽灵,一共有n个幽灵,第i只幽灵会掉落ai件弓箭手装备,bi个剑士装备。小明的收获总和是他猎杀的幽灵的ai值之和。小刚的收获总和是他猎杀的幽灵的bi值之和。小明小刚轮流行动,小明先手。两人都能保证一击必杀。小明和小刚的目的尽可能让自己收获比对方高。你需要求出两人都使用最优策略的情况下,输出他们的收获差。我们保证所有幽灵掉落装备总价值不同。
Input
第一行输入一个正整数n表示幽灵个数 第二行输入n和数a1,a2,a3…an 第二行输入n和数b1,b2,b3…bn
Output
输出他们的最大分差
Sample Input
3
8 7 6
5 4 2
Sample Output
10
Hint
小明选择1号和3号幽灵,得到了14件装备,小刚只能选择2号幽灵得到4件装备。差值为10. 1≤n≤10^5, -109≤ai,bi≤109
Source
SZTU Monthly 2020 Oct.
Author
徒手拆机甲
题目解析
这个题也是我的题。主要要考虑一个看起来不显然的贪心策略。给大家两种方式来证明一下这个贪心,一个比较感性认知。一个就是纯粹的数学证明。大家自己看看。
题目要求尽可能获得比对方更多的物品价值,所以除了考虑自己会得到的价值,也要考虑限制对方获得对其价值高的物品,简单来说,因为每个物品最后都会被选走,所以我们每次选择一个物品时,我们自身得到了这个物品提供的ai点价值,同时让对手在最后少得到了一个bi点价值,也就是每个物品在这个选择时所能提供的总价值是ai加bi,我们只需要把所有物品的ai+bi的和进行排序,按顺序依次选择价值和更大的物品,最终统计这种策略下的分差。
如果还是不理解,还有一种从数学角度出发的证明方式。假设当前所有幽灵已被杀死,此时小明得到的装备价值和为N,小刚得到的装备价值和为M。如果把小明选择的某个物品(a1,b1)和小刚的(a2,b2)交换,则交换后小明的价值和N′=N-a1+a2,小刚的M′=M+b1−b2.对于小明(目标保证N-M值最大)来说只有N′-M′的值更大此次交换才有意义。也就是N′-M′>N-M时最大.化简后得到a2+b2>a1+b1时小明才会选择交换。对于小刚也是同理,所以我们可以发现,每次选择ai+bi的和更大的物品更值得被选择。
本题时间复杂度为O(Nlogn)
#include<bits/stdc++.h>
using namespace std;
struct point{
int a,b;
}s[200005];
int cmp(point x,point y){
return x.a+x.b>y.a+y.b;
}
int main(){
int n,ans1=0,ans2=0,ans;
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i].a;
for(int i=1;i<=n;i++)
cin>>s[i].b;
sort(s+1,s+1+n,cmp);
for(int i=1;i<=n;i+=2)
ans1+=s[i].a;
for(int i=2;i<=n;i+=2)
ans2+=s[i].b;
if(ans1>ans2)ans=ans1-ans2;
else ans=ans2-ans1;
cout<<ans<<endl;
return 0;
}