POJ3629 2436(CUHK summer training on 28 JUN 2012)(队列、二进制)

本文探讨了两个编程挑战:一是利用数组优化打牌模拟问题,二是通过二进制操作解决牛乳混合问题,实现最大数量的病毒种类筛选。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AB水过。

C:POJ3629 打牌模拟题。K张牌中有N张好牌,每次发牌前将前P张放在最底,如何安排牌的位置使每次某人拿到的牌都是好牌。

  用数组自编一个queue可以AC,然而使用C++ vector 或者 queue 都会造成TLE。可见用数组模拟速度快不少。

 

D:POJ2436 有N头牛,有D种疾病,每头牛都含某几种、或者不含病。现将这些牛的牛奶混合在一起,且牛奶中的病毒种类不超过K种,问最多    能取几头牛的牛奶?

  思路:将每头牛的含病情况用二进制表示,例如若有三种病,且含第一二种病,则用110表示,若是含第二种病,则用010表示。然后用另一个二进制数表示K种病毒,用next_permutation()函数生成所有排列,每种排列都对每头牛用或(|)操作。最后取出最大的即可。

 

附D代码:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int cows[1000];

int cvt(string a){
    int b = 0;
    for(int j = 14; j >= 0; j--)
        if(a[j] == '1')
            b = b * 2 + 1;
        else
            b *= 2;
    return b;
}

int main(){
    int N, D, K;
    cin >> N >> D >> K;
    for(int i = 0; i < N; i++){
        int num;
        cin >> num;
        string temp(15, '0');
        while(num--){
            int x;
            cin >> x;
            temp[x - 1] = '1';
        }
        cows[i] = cvt(temp);
    }
//    for(int i = 0; i < N;i++)
//        cout << cows[i] <<" ";
    string t1(K, '1');
    string t2(15 - K, '0');
    string pot = t2 + t1;
    int max = 0;    
    do{
        int tpl = cvt(pot);
        int ans = 0;
        for(int i = 0; i < N; i++)
            if(tpl == (tpl | cows[i]))
                ans++;
        if(max < ans)
            max = ans;
    }while(next_permutation(pot.begin(), pot.end()));
    cout << max << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值