打籃球

鏈接:https://www.nowcoder.com/acm/contest/118/D
來源:牛客網

題目描述

1, 2, 3在打籃球, 可是二打一總是不公平的, 於是他們決定一對一,另一個人在邊上看着, 誰輸了誰就和下場和在邊上看着的那個人交換。 現在給你一個勝利者的序列(每一輪勝利的人), 問這個序列合不合法。(一開始1,2單挑, 3在下面看着)

輸入描述:

第一個數是數字n(1<=n<=100), 代表輸入的勝利者序列的規模, 接下來的n行描述了勝利者序列。第i行包含一個正整數a[i],(1<=a[i]<=3),代表着a[i]贏得比賽

輸出描述:

輸出YES如果勝利者序列合法, 否則NO

示例1
輸入

3
1
1
2
2
1
2

輸出

YES
NO

說明

第一個例子中, 1贏了2, 3代替2; 1贏了3, 2代替3; 2贏了
第二個例子中, 1贏了2, 3代替2, 這時候2明顯已經在場下了故不可能爲勝利者

思路

我們可以看出,一共只有三個人在比,那麼,我們不妨這樣設置,三個人編號分別爲a[1],a[2],a[3],正在打的人標記爲1,邊上看着的人標記爲-1。
那麼很明顯的,一開始a[1]=1,a[2]=1,a[3]=-1;
每打一場比賽,除了獲勝的人,剩下兩個人的狀態均改變(即-1變爲1,1變爲-1),那麼很明顯的,我們只需要將除獲勝者以外的人的標記量乘以-1即可

代碼

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int i,m;
    int b[5],a[5];
    while(scanf("%d",&m)!=EOF)
    {
        a[3]=-1;//初始時各個人的狀態
        a[1]=1;
        a[2]=1;
        for(i=0;i<m;i++)
        {
            scanf("%d",&b[i]);//每一盤獲勝的人的編號
        }
        for(i=0;i<m-1;i++)
        {
            if(a[b[i]]==1)//判斷這一盤獲勝的人是否是在打球的,如不是則他不可能獲勝,數據錯誤。
            {
                for(int j=1;j<=3;j++)
                    a[j]*=-1;
                a[b[i]]=1;
            }
            else
            {
                break;
            }
        }
        if(i==m-1&&a[b[m-1]]==1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章