首先發出題目鏈接:
鏈接:https://ac.nowcoder.com/acm/contest/882/D
來源:牛客網
涉及:優先隊列,bitset
點擊這裏回到2019牛客暑期多校訓練營解題—目錄貼
題目如下:
代碼如下:
#include <iostream>
#include <bitset>
#include <queue>
using namespace std;
typedef long long ll;
typedef bitset<105> BIT;
struct P{
ll data;
BIT bits;
int index;
bool operator<(const P &a) const{
return this->data>a.data;
}
P(ll da,BIT bi,int in){
this->data=da;
this->bits=bi;
this->index=in;
}
};
BIT bit[105];
int n,k;
ll w[105];
priority_queue<P> que;
inline int read(){
int x=0,w=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')w=0,ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
int main(){
cin>>n>>k;
int i,j,t;
for(i=1;i<=n;i++) w[i]=read();
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
scanf("%1d",&t);
bit[i][j]=t;
}
}
que.push(P(0,0,0));
while(!que.empty()){
P p=que.top();
que.pop();
if(k==1) return !printf("%lld",p.data);
else k--;
for(i=p.index+1;i<=n;i++)
if((p.bits&bit[i])==p.bits){
BIT x=p.bits;
x[i]=1;
que.push(P(p.data+w[i],x,i));
}
}
return !printf("-1");
}