Ball


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

Sample Output

YES
NO

Analysis

這是一道貪心題
球有兩個選擇,一個往左,另一個往右,必須保證每個桶中從上到下的球的編號由大到小,所以可以定義兩個變量儲存當前兩個桶中最上面那個球的編號。
貪心策略是
1.比兩個都大,選擇兩個桶中最大的編號(也就是兩個變量存的)大的那個放入;
2.只大於一個,就這一個;
3.比兩個都小,輸出“NO”,返回就行。

Code

#include<cstdio>  
int a,l1,l2,n;//l1,l2存桶中最大數
bool f;//標記找到
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        f=0;l1=0;l2=-1;//初始化,因爲本題數據中不可能出現相同的,所以l1,l2也應不同
        for(int j=1;j<=10;j++)
        {
            scanf("%d",&a);
            if(!f&&a<l2&&a<l1){printf("NO\n");f=1;continue;}//還需要把剩下的數輸入完(策略3)
            if(!f&&l1>l2){if(l1<a)l1=a;else l2=a;}
            if(!f&&l2>l1){if(l2<a)l2=a;else l1=a;}//策略1與2
        }
        if(!f)printf("YES\n");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章