题解:AT_joi2008yo_c カードゲーム

· · 题解

题目跳楼机

正文开始:

阅读理解

2n 张数字为 1\sim2n,两个人轮流出牌,只能出比上一张牌大的牌,当有人无法出牌时,清空桌面。当有人牌出完时,结束游戏,两人得分为对方剩余牌数。

现给出小 An 张牌,求两人得分。

思路:

注意到这道题的范围是 10^2,所以就可以直接模拟,不用担心其他的。为了模拟的方便,可以先进行排序。

代码实现:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x,i,j;
bool t[1005];
int a[1105],tt1,b[1205],tt2,id;
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    for(i=1;i<=n;i++)cin>>x,t[x]=1;
    for(i=1;i<=2*n;i++)t[i]?a[++tt1]=i:b[++tt2]=i;//统计两人卡牌 
    while(tt1&&tt2){//有一方已经没牌了就退出 
        x=0,i=1,j=1;//x 为最大值 
        while(i<=n&&j<=n&&tt1&&tt2){//有一方已经不能出牌了就退出 
            if(id==0)
                for(;i<=n;i++){if(a[i]>x){x=a[i],a[i]=0,tt1--;break;}}//寻找符合要求的牌 
            else
                for(;j<=n;j++)if(b[j]>x){x=b[j],b[j]=0,tt2--;break;}//寻找符合要求的牌
            id++,id%=2;//换人 
        }
    }
    cout<<tt2<<'\n'<<tt1<<'\n';//输出对方剩余的牌数 
    return 0;
}