其实要把该题归为贪心,也不知道是否是对的。。。题目就是有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;
}