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