bitset 总结:
1.用字符串赋值
b[i] = bitset<100>(str.c_str());
2.b.set() 将 b 的所有位置1
3.b.set( k,v ) s[k] = v;
3.b.reset() 将b 的所有位 变为 0
4.b.reset( k,v ) b[k] = 0;
4.b.flip() b = ~b;
5.b.flip(k) b[k] ^= 1
这题是个不太常见的暴力,要求出第k小的值,那么我们可以运用优先队列来进行暴力。可以类比于求一个图中距离某一点第k小的点是谁。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,pair<int,bitset<100>>> pii;
LL w[100];
struct Cmp{
bool operator ()( const pii& a,const pii& b ){
return a.first >b.first;
}
};
int main(){
int n,k;
scanf("%d%d",&n,&k);
for( int i = 0;i < n;i++ ) scanf("%lld",&w[i]);
bitset<100> b[n];
string str;
for( int i = 0;i < n;i ++ ){
cin >> str;
reverse( str.begin(),str.end() );
b[i] = bitset<100>(str.c_str());
}
bitset<100> cur;
cur.set();
priority_queue<pii, vector<pii>, Cmp> que;
que.push( pii(0,make_pair(-1,cur)) );
int cnt = 0;
LL ans = 0;
while( que.size() ){
pii cur = que.top();
LL v = cur.first;
LL x = cur.second.first;
bitset<100> curb = cur.second.second;
que.pop();
cnt++;
ans = v;
if( cnt == k ) break;
for( int i = x+1;i < n;i ++ ){
if( !curb[i] ) continue;
que.push( pii(v+w[i],make_pair(i,b[i]&curb) ));
}
}
if( cnt == k ){
printf("%lld",ans);
}else printf("-1");
return 0;
}