CodeForces 725 F.Family Photos(贪心)

来源:互联网 发布:淘宝助理怎么选类目 编辑:程序博客网 时间:2024/06/05 14:25

Description
有n组照片,每组两张,a1,b1,a2,b2分别表示A和B拿第一张和第二张照片得到的喜悦值,两人轮流拿照片,每次可以拿也可以不拿,A先,当两人都不拿或者拿完所有照片时结束,一组照片只有第一张被拿走才可以拿第二张,每次拿照片的人都想最大化自己的喜悦值与对方喜悦值之差,问两人都采取最佳策略的情况下最终A的喜悦值与B的喜悦值之差
Input
第一行一整数n表示照片组数,之后n行每行四个整数a1,b1,a2,b2分别表示A和B拿第一张和第二张照片得到的喜悦值(1<=n<=1e5,1<=a1,b1,a2,b2<=1e9)
Output
输出A的喜悦值与B的喜悦值之差
Sample Input
2
12 3 4 7
1 15 9 1
Sample Output
1
Solution
一. a1+b1 < a2+b2,双方都希望对方先取第一张(对A: a1-b2 < a2-b1;对B: b1-a2 < b2-a1)
1. a1 > b2,两人一直不取,由于a1-b2 > 0,所以A取这张照片对自己还是有利,所以A取第一张B取第二张,对答案的贡献是a1-b2
2. b1 > a2,两人一直不取,由于b1-a2 > 0,所以B取这张照片对自己还是有利,所以B取第一张A取第二张,对答案的贡献是a2-b1
3. a1<=b2且b1<=a2,两人先取对自己都没好处,所以没人取这组照片
二. a1+b1>=a2+b2,双方都希望自己先取,假设A全取,那么每组照片对答案的贡献就是a1+a2,记录a1+b1和a2+b2的值,因为如果B取了第一张照片则对答案的贡献是-(a1+b1),B取了第二张照片则对答案的贡献是-(a2+b2),记录的这些值表示B取要损失的值,把这些值排个序,由于是AB轮流取,A每次会选最大值因为A不想让答案损失太大,B每次会选最大值因为B想要答案损失最大,所以排完序后把奇数位置(假设从0开始)的给A,偶数位置的给B即可,由于把照片给A的情况对答案的贡献已经累加,所以只需要把给B的照片对答案的损失减去即可
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 222222int n,a1,b1,a2,b2,a[maxn],res; int main(){    while(~scanf("%d",&n))    {        ll ans=0;        res=0;        for(int i=0;i<n;i++)        {            scanf("%d%d%d%d",&a1,&b1,&a2,&b2);            if(a1+b1<a2+b2)            {                if(a1>b2)ans+=a1-b2;                else if(b1>a2)ans+=a2-b1;            }            else                 ans+=a1+a2,a[res++]=a1+b1,a[res++]=a2+b2;        }        sort(a,a+res);        for(int i=0;i<res;i+=2)ans-=a[i];        printf("%I64d\n",ans);    }    return 0;}
原创粉丝点击