分析
首先 状态压缩
然后 用最初的几包糖果(几个男嘉宾),依次询问每个状态(24位女嘉宾)是否需要更新
最后 检查末尾状态是否有答案
见注释
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define ffor(i,s,e) for(int i=0;i<e;i++)
#define nl cout<<endl
#define out(x) cout<<x<<" "
const int N = 1050000;
int n,m,k;
int step[N];//到从状态i至少要step[i]包糖果
int a[21];//初始的糖果状态
void init(){
cin>>n>>m>>k;
ffor(nth,0,n){
int state=0,pos;
ffor(i,0,k){
scanf("%d",&pos);
state|=1<<(pos-1);//状态压缩为二进制,出现则该位为1
}
a[nth]=state;
step[state]=1;
// out(state);nl;
}
}
void acWing(){
init();
int last=1<<m;
// out(e);nl;
ffor(j,0,n){//男嘉宾就几个
ffor(i,1,last){
if(step[i]&&i!=a[j]){//女嘉宾已有意思,且还没有和男嘉宾对话
int nxt=i|a[j];//下一状态
if(step[nxt]==0) step[nxt]=step[i]+1;//首次出现
else if(step[nxt]>step[i]+1) step[nxt]=step[i]+1;//更少则更新
}
}
}
if(step[last-1]){
cout<<step[last-1]<<endl;
}else{
cout<<-1<<endl;
}
}
int main(){
acWing();
return 0;
}
问题变得有趣了