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