萌妹子求助嘤嘤嘤QwQ
  • 板块CF79D Password
  • 楼主GIFBMP
  • 当前回复3
  • 已保存回复3
  • 发布时间2019/12/6 21:13
  • 上次更新2025/7/22 08:20:07
查看原帖
萌妹子求助嘤嘤嘤QwQ
122641
GIFBMP楼主2019/12/6 21:13

RT,没过样例

#include<cstdio>
#include<cstring>
#include<queue>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int n,k,m,dis[25][25],cf[10010],a[10010],cnt=-1,loc[10010],w[10010],f[(1<<20)+10];
void bfs(int s){
	memset(w,0,sizeof(w));
	for(int i=1;i<=n+1;i++)
		w[i]=0x3f3f3f3f;
	queue<int>q;
	q.push(s);w[0]=0;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=1;i<=m;i++){
			int pre=x-a[i],nxt=x+a[i];
			if(pre>0&&w[pre]==0x3f3f3f3f)
				w[pre]=w[x]+1,q.push(pre);
			if(nxt<=n+1&&w[nxt]==0x3f3f3f3f)
				w[nxt]=w[x]+1,q.push(nxt);
		}
	}
	for(int i=1;i<=n+1;i++)
		if(loc[i]>=0)
			dis[loc[s]][loc[i]]=w[i];
}
int main(){
	scanf("%d%d%d",&n,&k,&m);
	for(int i=1;i<=k;i++){
		int x;
		scanf("%d",&x);
		cf[x]=1;
	}
	for(int i=1;i<=m;i++)
		scanf("%d",&a[i]);
	for(int i=n+1;i;i--)
		cf[i]^=cf[i-1];
	memset(loc,-1,sizeof(loc));
	for(int i=1;i<=n+1;i++)
		if(cf[i])loc[i]=++cnt;
	cnt++;
	for(int i=1;i<=n+1;i++)
		if(cf[i])bfs(i);
	for(int i=1;i<(1<<cnt);i++)f[i]=0x3f3f3f3f;
	for(int i=0;i<(1<<cnt);i++){
		if(f[i]==0x3f3f3f3f)
			continue;
		for(int j=0;j<cnt;j++){
			if((i>>j)&1)continue;
			for(int k=j+1;k<cnt;k++)
				if(!((i>>k)&1))f[i+(1<<j)+(1<<k)]=min(f[i+(1<<j)+(1<<k)],f[i]+dis[j][k]);
		}
	}
	printf("%d",f[(1<<cnt)-1]==0x3f3f3f3f?-1:f[(1<<cnt)-1]);
	return 0;
}
2019/12/6 21:13
加载中...