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