记录编号 588356 评测结果 AAAAAAAAAA
题目名称 神奇的宝物 最终得分 100
用户昵称 Gravatarsnow 是否通过 通过
代码语言 C++ 运行时间 0.652 s
提交时间 2024-05-28 21:03:58 内存使用 4.82 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
//本程序有bug(但一定能得满分),如若只求满分,可直接使用,具体思路如下 
//思路(小A为全局先手,小B为全局后手):
//因为先手(相对的,可以是小A,也可以是小B)一定会想办法使自己所得利益与后手(相对的)的差距更大;(分析出贪心的优先条件) 
//又因为每个宝物都会被选,因此,当先手宝物被先手(相对的)选走后,后手(相对的)只能选择后手宝物;(分析出挑选条件的主观性和可行性)
//所以,先手(相对的)一定会优先选择先手宝物所获利益与后手宝物所获利益差距更大的宝物种类进行选择;
//因此,只需求出各类宝物先、后手宝物的所获利益差并进行排序,再对双方的不可能性(指单独一个人全取先手值)最大收益进行交替做差,再将所得数据输出即可 
int n,a[100005],b[100005],c[100005];//n表示宝物种类,a为先手宝物,b为后手宝物,c为差值 
long long numa=0,numb=0;
int main()
{
    freopen("treasure.in","r",stdin);
    freopen("treasure.out","w",stdout);
    cin>>n;
    for(int i=0;i<n;++i)
    {
        cin>>a[i]>>b[i];
        numa+=a[i]; 
        numb+=a[i];//numa,numb为双方的不可能性(指单独一个人全取先手值)最大收益
        c[i]=a[i]-b[i];
    }
    sort(c+0,c+n);
    for(int i=0;i<=n;++i)
    {
        if(i%2)
        {
            numa-=c[i];//做差(初心:求小A的获利总值) 
        }
        else
        {
            numb-=c[i];//做差(初心:求小B的获利总值) 
        }
    }
    cout<<max(numa,numb)<<' '<<min(numa,numb);//先手获利值一定是较大方,因此要套上max,min(初心:直接输出小A,小B,不做任何判断) 
    return 0; 
}