记录编号 337677 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 2526.__围栏问题 最终得分 100
用户昵称 rewine 是否通过 通过
代码语言 C++ 运行时间 0.135 s
提交时间 2016-11-04 19:18:37 内存使用 4.79 MiB
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>

using namespace std;

int m,k,n,x[20],y[20],f[17][1<<16],cost[1<<16],s[20],ans;

void dfs(int now,int cnt,int res)
{
	if (now==n)
	{
		if (res<ans) ans=res;
		return;
	}
	if (res+(k-cnt)*4>=ans) return;
	for (int a=1;a<=cnt;a++)
	{
		int pres=s[a];
		s[a]|=(1<<now);
		dfs(now+1,cnt,res-cost[pres]+cost[s[a]]);
		s[a]^=(1<<now);
	}
	if (cnt<k)
	{
		cnt++;
		s[cnt]=(1<<now);
		dfs(now+1,cnt,res+4);
	}
}

int main()
{
	freopen("xfence.in","r",stdin);
	freopen("xfence.out","w",stdout);

	scanf("%d%d%d",&m,&k,&n);
	for (int a=0;a<n;a++)
		scanf("%d%d",&x[a],&y[a]);
	if (n<=14)
	{
		memset(f,0x3f,sizeof(f));
		for (int a=1;a<(1<<n);a++)
		{
			int sx=1001,mx=-1,sy=1001,my=-1;
			for (int b=0;b<n;b++)
				if ((a>>b)&1)
				{
					if (x[b]<sx) sx=x[b];
					if (x[b]>mx) mx=x[b];
					if (y[b]<sy) sy=y[b];
					if (y[b]>my) my=y[b];
				}
			f[1][a]=(mx-sx+1)*2+(my-sy+1)*2;
		}
		for (int a=2;a<=k;a++)
			for (int b=0;b<(1<<n);b++)
				for (int c=b-1;c;c=(c-1)&b)
					f[a][b]=min(f[a][b],f[a-1][c]+f[1][b^c]);
		int ans=f[1][(1<<n)-1];
		for (int a=2;a<=k;a++)
			ans=min(ans,f[a][(1<<n)-1]);
		printf("%d\n",ans);
	}
	else
	{
		ans=4000;
		for (int a=1;a<(1<<n);a++)
		{
			int sx=1001,mx=-1,sy=1001,my=-1;
			for (int b=0;b<n;b++)
				if ((a>>b)&1)
				{
					if (x[b]<sx) sx=x[b];
					if (x[b]>mx) mx=x[b];
					if (y[b]<sy) sy=y[b];
					if (y[b]>my) my=y[b];
				}
			cost[a]=(mx-sx+1)*2+(my-sy+1)*2;
		}
		dfs(0,0,0);
		printf("%d\n",ans);
	}

	return 0;
}