図のように二股に分かれている容器があります。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
百度翻译:有如图所示分开的容器。1到10编号的10个球从容器的开口部A掉下,左边的筒B或者右边的筒C放入玉石。板D可以以支点E为中心左右旋转,通过移动板D,来决定筒B和筒C放在哪一个。
开口部A给予从丢落的玉石的排列。将它们按顺序放入筒B或筒C。此时,筒B和筒C各自的在号码小的玉石上被排列大的玉石的情况YES,如果不能排列请制作出NO输出的程序。但是,不能在容器中更换玉的顺序。另外,作为能够连续放进同一个筒子里的东西,筒B, C一起有10个球全部放进去的富余的东西。
思路:简单一点,先将一个容器里填满,从小到大。在填充另一个容器,如果填充过程中出现无法填充,则NO。
1 #include <cstdio> 2 #include <fstream> 3 #include <algorithm> 4 #include <cmath> 5 #include <deque> 6 #include <vector> 7 #include <queue> 8 #include <string> 9 #include <cstring> 10 #include <map> 11 #include <stack> 12 #include <set> 13 #include <sstream> 14 #include <iostream> 15 #define mod 1000000007 16 #define eps 1e-6 17 #define ll long long 18 #define INF 0x3f3f3f3f 19 using namespace std; 20 21 int n,q[1005]; 22 int main() 23 { 24 scanf("%d",&n); 25 while(n--) 26 { 27 for(int i=0;i<10;i++) 28 { 29 cin>>q[i]; 30 } 31 int ma=q[0]; 32 q[0]=-1; 33 for(int i=1;i<10;i++) 34 { 35 if(q[i]>ma) 36 { 37 ma=q[i]; 38 q[i]=-1; 39 } 40 } 41 ma=-1; 42 bool bo=false; 43 for(int i=0;i<10;i++) 44 { 45 if(q[i]==-1) 46 continue; 47 if(q[i]<ma) 48 { 49 bo=true; 50 break; 51 } 52 else 53 { 54 ma=q[i]; 55 } 56 } 57 if(bo) 58 { 59 printf("NO "); 60 } 61 else 62 { 63 64 printf("YES "); 65 } 66 } 67 }