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");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值