CodeForces 725 F.Family Photos(贪心)

本文介绍了一个关于两人轮流选择照片以最大化各自喜悦值之差的问题,并提供了详细的解决方案及代码实现。通过分析不同情况下的策略选择,文章展示了如何使用编程解决这类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值