比赛 20120709 评测结果 AAAAATTTTT
题目名称 磁性链 最终得分 50
用户昵称 TBK 运行时间 5.002 s
代码语言 C++ 内存使用 0.32 MiB
提交时间 2012-07-09 10:27:55
显示代码纯文本
#include <iostream> 
#include <cmath> 
#include <cstring> 
#include <string> 
#include <cstdio> 
#include <cstdlib> 
#include <iomanip> 
#include <set> 
#include <algorithm> 
#define MAXN 0x7fffffff 
using namespace std; 
int a[1000],b,c,d,l,m,n,t,s=MAXN,r[1001];
bool bo[1001],boo[1000];
void DFS(int k)
{
	int i,j,l[1001],m,n,x;
	if (k==c)
	{
		if (t<s) s=t;
		return;
	}
	for (i=0;i<c;i++)
		if (boo[i]==false) 
		{
			bo[a[i]]=true;
			boo[i]=true;
			t+=r[a[i]];
			m=1;
			n=0;
			for (j=1;j<=b;j++) l[j]=r[j];
			for (j=1;j<=b;j++)
			{
				if ((r[j]!=-MAXN)&&(bo[j]!=true)) r[j]=0-m;
				if (bo[j]==true)
				{
					for (x=j;x>=m;x--) 
						if ((r[x]!=-MAXN)&&(bo[x]!=true)) r[x]+=j-1;
					m=j+1;
				}
			}
			for (x=j-1;x>=m;x--) 
				if ((r[x]!=-MAXN)&&(bo[x]!=true)) r[x]+=j-1;
			DFS(k+1);
			for (j=1;j<=b;j++) r[j]=l[j];
			boo[i]=false;
			bo[a[i]]=false;
			t-=r[a[i]];
		}
}
int main(void) 
{    
    freopen("linka.in","r",stdin); 
    freopen("linka.out","w",stdout); 
	scanf("%d%d",&b,&c);
	for (d=0;d<c;d++) scanf("%d",&a[d]);
	for (d=0;d<=b;d++) r[d]=-MAXN;
	for (d=0;d<c;d++) r[a[d]]=b-1;
	DFS(0);
	printf("%d",s);
    fclose(stdin); 
    fclose(stdout); 
    return 0; 
}