92分求调(#7#8)
  • 板块P3943 星空
  • 楼主TonyZhou2011
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/26 00:13
  • 上次更新2024/10/26 08:14:32
查看原帖
92分求调(#7#8)
642011
TonyZhou2011楼主2024/10/26 00:13
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
const ll N=4e4+10,M=129,P=65537,K=17;
ll d[P],ds[K][N],a[K],b[M];//M=127
ll q[N],n,k,m,f,c;
int main(){
	scanf("%lld%lld%lld",&n,&k,&m);
	for(ll i=1;i<=k;i++){
		scanf("%lld",&a[i*2-1]);
		a[i*2]=a[i*2-1]+1;
	}
	for(ll i=1;i<=m;i++){
		scanf("%lld",&b[i*2]);
		b[i*2-1]=-b[i*2];
	}
	for(ll i=1;i<=2*k;i++){
		c++;
		if(a[i]!=a[i+1]&&c%2){
		a[f++]=a[i],c=0;}
	}
	memset(ds,0x3f,sizeof(ds));
	memset(d,0x3f,sizeof(d)),d[0]=0;
	for(ll i=0;i<f;i++){
		ll h=1,t=1;
		q[1]=a[i],ds[i][a[i]]=0;
		while(h<=t){
			for(ll j=1;j<=2*m;j++){//no2
				ll tp=q[h]+b[j];
				if(tp>0&&tp<=n+1&&ds[i][tp]>1e9){
					ds[i][tp]=ds[i][q[h]]+1;
					q[++t]=tp;//!ds
				}
			}
			h++;
		}
	}
	for(ll i=0;i<1<<f;i++){
		for(ll j=0;j<f;j++){
			ll &tp=d[i|(1<<j)];
			tp=min(tp,d[i]+ds[j][n+1]);
		}
		for(ll j=0;j<f;j++){
			for(ll k=0;k<f;k++){
				if(j==k) continue;//no
				ll &tp=d[i|(1<<j)|(1<<k)];
				tp=min(tp,d[i]+ds[j][a[k]]);
			}
		}
	}
	printf("%lld",d[(1<<f)-1]);
	return 0;
}

2024/10/26 00:13
加载中...