AB水过。
C:POJ3629 打牌模拟题。K张牌中有N张好牌,每次发牌前将前P张放在最底,如何安排牌的位置使每次某人拿到的牌都是好牌。
用数组自编一个queue可以AC,然而使用C++ vector 或者 queue 都会造成TLE。可见用数组模拟速度快不少。
D:POJ2436 有N头牛,有D种疾病,每头牛都含某几种、或者不含病。现将这些牛的牛奶混合在一起,且牛奶中的病毒种类不超过K种,问最多 能取几头牛的牛奶?
思路:将每头牛的含病情况用二进制表示,例如若有三种病,且含第一二种病,则用110表示,若是含第二种病,则用010表示。然后用另一个二进制数表示K种病毒,用next_permutation()函数生成所有排列,每种排列都对每头牛用或(|)操作。最后取出最大的即可。
附D代码:
#include#include #include 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;}