POJ3629 2436(CUHK summer training on 28 JUN 2012)(隊列、二進制)

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章