题解:P15052 [UOI 2023 II Stage] Memory training

· · 题解

本题作为黄题还是太水了

题意简述

一个数组,每轮当前玩家取走一个数,并报出剩余的数。已知初始数组和每一轮报出的数组,求两人分别取得的数。

解题思路

利用每次取数后,数组总和的变化来求每次被取走的数。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[2026];
int sum,sum1;//用于取差
int ans1[2026],ans2[2026];
int cnt1,cnt2;//记录两组取的数的个数
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    sum1=sum;
    for(int i=1;i<n;i++){
        sum=0; 
        for(int j=1;j<=n-i;j++){
            int x;
            cin>>x;
            sum+=x;
        }
        if(i%2==1){
            cnt1++;
            ans1[cnt1]=sum1-sum;
        }else{ 
            cnt2++;
            ans2[cnt2]=sum1-sum;
        }
        sum1=sum;//更新剩余数的和
    }
    //特判最后一个数
    if(n%2==1){
        cnt1++;
        ans1[cnt1]=sum1;
    }else{
        cnt2++;
        ans2[cnt2]=sum1;
    }
    //从小到大排序
    sort(ans1+1,ans1+cnt1+1);
    sort(ans2+1,ans2+cnt2+1);
    //快乐地输出
    for(int i=1;i<=cnt1;i++){
        cout<<ans1[i]<<" ";
    }
    cout<<"\n";
    for(int i=1;i<=cnt2;i++){
        cout<<ans2[i]<<" ";
    }
    return 0;
}

完结撒花QAQ