玉
図のように二股に分かれている容器があります。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
题目大意是问能不能使一串数字掉落后变成两串增序的数字,挑战程序设计上归类是深搜,我用两个栈模拟的。
#include <iostream> #include <climits> #include <queue> #include <stack> #include <set> #include <map> #include <algorithm> #include <cmath> #include <cstring> #include <cstdio> #include <vector> #define ll long long #define REP(i, n) for (int i=0;i<n;++i) #define REP_1(i, n) for (int i=1;i<=n;++i) #define REP_2(i, j, n, m) REP(i, n) REP(j, m) #define REP_2_1(i, j, n, m) REP_1(i, n) REP_1(j, m) #define JU_RAN(a,x,b) a<=x&&x<=b using namespace std; int v[15]; void solve(){ int n; cin>>n; while (n--){ REP_1(i,10)cin>>v[i]; stack<int > a; stack<int > b; a.push(0); b.push(0); bool f=1; REP_1(i,10){ if(a.top()>=b.top()){ if(a.top()<v[i]){ a.push(v[i]); } else if(b.top()<v[i]){ b.push(v[i]); } else{ f=0; break; } } else{ if(b.top()<v[i]){ b.push(v[i]); } else if(a.top()<v[i]){ a.push(v[i]); } else{ f=0; break; } } } if(f){ cout<<"YES"<<endl; } else{ cout<<"NO"<<endl; } } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); #ifdef LOCAL_DEFINE freopen("input.txt", "rt", stdin); #endif solve(); #ifdef LOCAL_DEFINE cerr << "\nTime elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n"; #endif return 0; }