AOJ0033——Ball(貪心)

題目鏈接


       其實要把該題歸爲貪心,也不知道是否是對的。。。題目就是有10個球,分別標號爲1~10,但是順序不知,從A管口放下,然後你可以控制當前放下的求進入B管或者C管,如果能使10個球放完,B和C管中的球的標號重下到上依次遞增就輸出YES,否則NO。看了網上好多說法,有DFS的,還有二進制的,,,搞得我有點慌,因爲我自己也看到不是太懂,而本題實際上也很簡單,放入當前球時,比較當前球的標號和兩管中最上面的球的標號大小,如果當前球比另外兩個都小,那麼直接輸出NO即可,如果比其中一個大,那麼就放在那個球上面,如果比兩個球的標號都大,那麼就放在標號比較大的球上面,爲什麼要這樣做?

        比如當前球爲7,管中的球爲6和1,那麼我們應當把7放在6上面,倘若你把7放在1上面,那麼現在下面兩管就是6和7,如果接下來要放的球爲2的話,就無法放進去了。相反,你先把7放在6上面,那麼當前兩管的就是7和1,那麼2就能放了,放在1上面即可。這就是爲什麼要優先放在編號較大的球上,那是要儘量給標號小的球留更多的可放空間,這就是我認爲的一種貪心,如果按這種策略能全部放進就輸出YES,否則NO。


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;

int s[10]={0};

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        for(int i=0;i<10;i++)
            scanf("%d",&s[i]);
        int a=0,b=0;
        bool flag=0;
        for(int i=0;i<10;i++)
        {
            if(s[i]<a&&s[i]<b)
            {
                flag=1;
                break;
            }
            else if(s[i]<a&&s[i]>b)b=s[i];
            else if(s[i]>a&&s[i]<b)a=s[i];
            else
            {
                a=a>b?s[i]:a;
                b=a<b?s[i]:b;
                if(a==b)a=s[i];
            }
        }
        if(flag)printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}


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