Aizu 0033 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

Output for the Sample Input

YES
NO

題目描述:

給十個數, 問能不能至多按順序變成兩個遞增序列。

解題思路:

一打開發現是滿篇的日文, 又被歸類在搜索裏面了, 不禁默默打開了百度翻譯。。。

但是其實就是一個很簡單的貪心(先可着一個放,兩個都放了之後可着大的序列放)而且竟然沒有人這麼寫(一定是我的方法菜到不屑於敲那麼多。。。嗯), ac之後看了大牛們寫的方法。 那都是些啥???(開始記筆記)

然後又從筆記裏寫了一種DFS的, 看着賊高端也節省了代碼量。

代碼:

 暴力貪心

#include <bits/stdc++.h>

using namespace std;

int main() {
    int t;

    scanf("%d", &t);
    while (t--) {

        int a = -1, b = -1, temp;
        bool flag = 0;
        for(int i = 0; i < 10; ++i) {
            scanf("%d", &temp);

            if (a == -1 && b == -1) {
                a = temp;
                continue;
            }
            if (a != -1 && b == -1) {
                if (temp > a) a = temp;
                else b = temp;
                continue;
            }

            if (temp <= a && temp <= b)
                flag = 1;
            else if (temp > a && temp < b)
                a = temp;
            else if (temp > b && temp < a)
                b = temp;
            else if (temp > b && temp > a) {
                if (b > a) b = temp;
                else a = temp;
            }
        }
        if (flag) printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}

DFS

#include <bits/stdc++.h>

using namespace std;

int arr[15];

bool DFS(int l, int r, int i) {
    if (i == 10) return true;
    return ( ((!~l||arr[i]>arr[l]) && DFS(i, r, i+1)) || ((!~r||arr[i]>arr[r]) && DFS(l, i, i+1)));
}

int main() {
    int t;

    scanf("%d", &t);
    while (t--) {

        for (int i = 0; i < 10; ++i)
            scanf("%d", &arr[i]);
        if (DFS(-1, -1, 0)) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章