• aoj 0033 玉


    図のように二股に分かれている容器があります。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十个数顺序不同,从第一个数开始要么放到左边要么放到右边,要求无论左边右边从下往上要递增,是否能达成要求。
    dfs枚举各种情况。
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    #define Max 102
    using namespace std;
    int t,in[11],l[11],r[11],flag;
    void dfs(int a,int b,int k) {
        if(k > 10)flag = 1;
        if(flag)return;
        if(in[k] > l[a - 1]) {
            l[a] = in[k];
            dfs(a + 1,b,k + 1);
        }
        if(in[k] > r[b - 1]) {
            r[b] = in[k];
            dfs(a,b + 1,k + 1);
        }
    }
    int main(){
        while(~scanf("%d",&t)) {
            while(t --) {
                flag = 0;
                for(int i = 1;i <= 10;i ++) {
                    scanf("%d",&in[i]);
                }
                dfs(1,1,1);
                puts(flag ? "YES" : "NO");
            }
        }
        return 0;
    }
  • 相关阅读:
    Android之Margin和Padding属性及支持的长度单位
    java jvm eclipse 性能调优
    spring aop 内部方法调用事务不生效问题解决
    服务器 获取用户 真实ip
    Nginx gzip配置
    全局唯一的支付和订单id生成算法
    spring aop 方法增加日志记录
    linux cp复制文件 直接覆盖
    Twitter分布式自增ID算法snowflake原理解析
    nginx 命令
  • 原文地址:https://www.cnblogs.com/8023spz/p/9460463.html
Copyright © 2020-2023  润新知