来自《挑战程序设计竞赛》
1.题目原文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0033日文题……
有一个形似央视大楼(Orz)的筒,从A口可以放球,放进去的球可通过挡板DE使其掉进B裤管或C裤管里,现有带1-10标号的球按给定顺序从A口放入,问是否有一种控制挡板的策略可以使B裤管和C裤管中的球从下往上标号递增。
输入:
第一行输入数据组数N。接下来N行为N组具体数据,每组数据中有10个整数,代表球的放入顺序。
输出:
对于每组数据,若策略存在,输出YES;若不存在,输出NO
2.解题思路
采用二进制枚举
每个球都有两种情况,向左或者向右,共有2^10-1024种情况,枚举即可。
关于static_cast的用法还是不懂,见博文
http://www.cnblogs.com/ider/archive/2011/07/31/cpp_cast_operator_part4.html
3.AC代码
#include <iostream>
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>
#include<utility>
#include<cmath>
#include<bitset>
using namespace std;
double EPS=1e-10;
int main()
{
int t;
cin>>t;
while(t--){
int ball[10];
for(int i=0;i<10;i++){
cin>>ball[i];
}
bitset<10> direction;
int all=1024;
while(all-->0){
direction=static_cast<bitset<10> >(all);
bool prefect=true;
int left=0;
int right=0;
for(int i=0;i<10;i++){
if(direction[i]){
if(ball[i]>left){
left=ball[i];
}
else{
prefect=false;
break;
}
}
else{
if(ball[i]>right){
right=ball[i];
}
else{
prefect=false;
break;
}
}
}
if(prefect){
break;
}
}
if(all>=0){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
return 0;
}