#33824: C++解法


kk20180820@gmail.com (Wayne Yang)

School : 國立鳳山高級中學
ID : 172018
IP address : [49.159.254.231]
Last Login :
2024-03-16 17:31:07
h035. 夜市 (Night Market) -- TOI練習賽202112新手組第3題 | From: [49.159.254.231] | Post Date : 2023-02-06 03:24

//自家小電腦跑不動,但是丟到zerojudge是AC的

 

 

//使用can隨時動態記錄立牌同時倒下的數量,可能因為擊倒或重新升起加減

//主要宣告兩個bool陣列

//一個(bool b[9])紀錄動態: 立牌是否已經被打倒,過了12秒會再升起

//打個比方如果某立牌已經被打倒而且還沒升起,而我又丟到那個立牌,這時要看bool b[9]判斷can是否要增加

//一個(bool c[9])紀錄累積: 哪些立牌被打倒過

//最後使用sum加總那些紀錄在bool c[9]裡面的立牌所代表的分數

#include<iostream>
using namespace std;

int main(void)
{


    bool b[9] = { };
    bool c[9] = { };

    int n;
    cin>>n;

    int a[305] = { };
    for(int L=0;L<n;L++){
        cin>>a[L];
    }

    int can=0;
    int sum=0;
    int k=0;
    while(k<n && can<9){     //跳離條件是 [丟完所有的球] 或 [同時擊倒所有立牌]        寫在while迴圈裡就是( [尚未丟完所有的球] 且 [尚未同時擊倒所有立牌] )
        if(a[k] != -1){

            if( ! b[a[k]-1] ){          //a[k]號立牌若尚未被打倒,則將b[a[k]-1]設為已打倒,並記錄在累加bool c[9]中
                b[a[k]-1] = true;
                c[a[k]-1] = true;
                can++;                //因為又有新的立牌被打倒,將同時倒下的立牌數量加1
            }

        }

        if(k>=12){              //如果已經過了十二秒

            if(b[a[k-12]-1] && a[k-12] != -1){    //檢查是否有立牌要升起,a[k-12]立牌必須是倒下的(b[a[k-12]-1]=true)
                b[a[k-12]-1] = false;
                can--;                                 //因為又有新的立牌升起,同時倒下的立牌減1
            }

        }
        k++;
    }

    if(can>=9){                                  //是透過條件 [同時擊倒所有立牌] 跳離while迴圈的
        cout<<"perfect"<<endl;
    }else{
        if(k>=n){                                 //是透過條件 [丟完所有的球] 跳離while迴圈的
            for(int i=0;i<9;i++){
                if(c[i]){
                    sum += i+1;
                }
            }
            cout<<sum<<endl;
        }
    }

 


    return 0;
}

 
ZeroJudge Forum