SZTUOJ 1023.万圣节大作战

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值