其實要把該題歸爲貪心,也不知道是否是對的。。。題目就是有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;
}