题解:CF725F Family Photos

· · 题解

好妙好可爱的贪心啊,只是我太弱想不完,还要学长的提示。

翻译是*。

题目大意:

n 组照片,每组照片有两张,第一张对于 a,b 的贡献分别为 a_1,b_1,第二张为 a_2,b_2,取了第一张才能取第二张。两人都采取最优策略使自己的贡献和比对方尽可能大得多,问最后 ab 的差值。

思路:

对于一组照片:

1.对于 a_1-b_2\le a_2-b_1 的情况,即后手更优(或者一样):

2.对于 a_1-b_2>a_2-b_1 的情况,即先手更优:

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 200005//拆成两张双倍空间 
int n;
struct node{
    int a,b;
}a[N];
inline int read(){
    int a=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        a=a*10+c-'0';
        c=getchar();
    }
    return a*f;
}
bool cmp(node a,node b){
    return a.a+a.b>b.a+b.b;
} 
main(){
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    n=read();
    int ans=0,cnt=0;
    for(int i=1;i<=n;i++){
        int a1=read(),b1=read(),a2=read(),b2=read();
        if(a1-b2>a2-b1){//先手优,先存起来,两张照片分开 
            a[++cnt].a=a1,a[cnt].b=b1;
            a[++cnt].a=a2,a[cnt].b=b2;
            continue;
        }
        if(a1-b2<=0&&b1-a2<=0)continue;//后手优,但先手<=0,不取
        if(0<a1-b2)
            ans+=a1-b2;//a先手>0 
        else
            ans+=a2-b1;//b先手>0 
    }
    sort(a+1,a+1+cnt,cmp);
    for(int i=1;i<=cnt;i++){//交替给a和b 
        if(i%2)
            ans+=a[i].a;
        else
            ans-=a[i].b;
    }
    printf("%lld\n",ans);
    return 0;
}

希望自己能记住这题,这题解写得不容易,这题也不容易。