//自家小電腦跑不動,但是丟到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;
}