solution of AOJ 0033:ball (《挑战程序设计竞赛(第2版)》)

有一个形似央视大楼(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值