有一个形似央视大楼(Orz)的筒,从A口可以放球,放进去的球可通过挡板DE使其掉进B裤管或C裤管里,现有带1-10标号的球按给定顺序从A口放入,问是否有一种控制挡板的策略可以使B裤管和C裤管中的球从下往上标号递增。
输入:
第一行输入数据组数N。接下来N行为N组具体数据,每组数据中有10个整数,代表球的放入顺序。
输出:
对于每组数据,若策略存在,输出YES;若不存在,输出NO
Sample Input
2
3 1 4 2 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
Output for the Sample Input
YES
NO
结题思路 :
题意要求我们将队列随机分成两部分,要求两部分都是递增排序出现的可能。
要求1:由于球数限制为10个,则随机的两部分的随机的可能组合是有限的(
210=1024
);
要求2:进行二进制枚举即可,若出现可行解方案,直接跳出。
程序步骤:
第一步、利用bitset直接将数据进行对应的强转;
第二步、判断当前的组合形式是否为可行解,若是,则结束。
具体程序(AC)如下:
#include <iostream>
#include <vector>
#include <bitset>
#define maxLen 10
using namespace std;
int main()
{
int n;
cin>> n;
int listNum[maxLen];
bitset<maxLen> twoPart;
while(n--)
{
for(int i = 0; i < maxLen; ++i)
cin>> listNum[i];
int start = 1024;
bool valid;
int part1Pre;
int part2Pre;
while(start-- >= 0)
{
valid = true;
part1Pre = part2Pre = -1;
twoPart = static_cast<bitset<maxLen> >(start);
for(int i = 0; i < maxLen; ++i)
{
if(twoPart[i] && part1Pre < listNum[i])
part1Pre = listNum[i];
else if(!twoPart[i] && part2Pre < listNum[i])
part2Pre = listNum[i];
else
{
valid = false;
break;
}
}
if(valid)
break;
}
if(valid)
cout<< "YES"<< endl;
else
cout<< "NO"<< endl;
}
return 0;
}