Ball
玉
図のように二股に分かれている容器があります。1 から 10 までの番号が付けられた10 個の玉を容器の開口部 A から落とし、左の筒 B か右の筒 C に玉を入れます。板 D は支点 E を中心に左右に回転できるので、板 D を動かすことで筒 B と筒 C のどちらに入れるか決めることができます。
開口部 A から落とす玉の並びを与えます。それらを順番に筒 B 又は筒 Cに入れていきます。このとき、筒 B と筒 C のおのおのが両方とも番号の小さい玉の上に大きい玉を並べられる場合は YES、並べられない場合は NO と出力するプログラムを作成してください。ただし、容器の中で玉の順序を入れ替えることはできないものとします。また、続けて同じ筒に入れることができるものとし、筒 B, C ともに 10 個の玉がすべて入るだけの余裕があるものとします。
Input
複数のデータセットが与えられます。1行目にデータセット数 N が与えられます。つづいて、N 行のデータセットが与えられます。各データセットに 10 個の番号が左から順番に空白区切りで与えられます。
Output
各データセットに対して、YES または NO を1行に出力して下さい。
Sample Input
2 3 1 4 2 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1
Output for the Sample Input
YES NO
题解:简单的模拟一下就好了,a[0], a[1],代表两个通道,如果满足条件则替换当前的值, 如果不满足则标记一下,要是两个都不满足则跳出,输出“NO”
AC代码:
1 #include<iostream> 2 using namespace std; 3 4 int a[15], b[2], flag[2]; 5 6 int main() 7 { 8 int t; 9 cin >> t; 10 while(t--) 11 { 12 int is_yes = 1; 13 b[0] = b[1] = 0; 14 for(int i = 0; i < 10; i++) 15 cin >> a[i]; 16 for(int i = 0; i < 10; i++) 17 { 18 flag[0] = flag[1] = 0; 19 for(int j = 0; j < 2; j++) 20 { 21 //cout << "a[i]" << a[i] << endl; 22 if(b[j] == 0) 23 { 24 b[j] = a[i]; 25 break; 26 } 27 else if(b[j] < a[i]) 28 { 29 b[j] = a[i]; 30 break; 31 } 32 flag[j] = 1; 33 } 34 //for(int j = 0; j < 2; j++) 35 //cout << "b[" << j <<"] = " << b[j] << endl; 36 if(flag[1] && flag[0]) 37 { 38 cout << "NO" << endl; 39 is_yes = 0; 40 break; 41 } 42 } 43 if(is_yes) 44 cout << "YES" << endl; 45 } 46 47 48 return 0; 49 }
永远渴望,大智若愚(stay hungry, stay foolish)