Cod sursa(job #176458)

Utilizator gigi_becaliGigi Becali gigi_becali Data 11 aprilie 2008 11:57:40
Problema Cc Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
using namespace std;
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#define N 101

int f2(int);
int a[N][N];
int n;
int perm[N][N];

inline int f(int p)
{
	int i;
	int s=0;
	for(i=1;i<=n;++i)
		s+=a[i][perm[p][i]];
	
	return s;
}

inline int f2(int x[])
{
	int s=0;
	for(int i=1;i<=n;++i)
		s+=a[i][x[i]];
	return s;
}

void init()
{
	int i, j;
	for(i=1;i<=n;++i)
		for(j=1;j<=n;++j)
			perm[i][j]=j;
		
	for(i=1;i<=n;++i) random_shuffle(perm[i]+1, perm[i]+n+1);
			
}

inline void mutatie(int i)
{
	int p=rand()%n+1;
	int q=rand()%n+1;
		
	int t=perm[i][p];
	perm[i][p]=perm[i][q];
	perm[i][q]=t;
}



void solve()
{
	init();
	int i,j,k, smin=0x3f3f3f3f;
	for(i=1;i<=1000;++i)
	{
		for(j=1;j<=n;++j) 
		{
			for(k=1;k<=n;++k) mutatie(k);
			if(smin>f(j)) smin=f(j);
		}
		
	}
		
	freopen("cc.out","w",stdout);
	printf("%d\n", smin);
	
}

inline int swap(int i, int j, int x[])
{
	int t=x[i];
	x[i]=x[j];
	x[j]=t;
}

void solve2()
{
	int x[N];
	int i, j;
	for(i=1;i<=n;++i) x[i]=i;
	
	random_shuffle(x+1,x+n+1);
	int smin=f2(x),s=smin;
	int p, q,t;
	for(i=1;i<=1000000;++i)
	{
		p=rand()%n+1;
		q=rand()%n+1;
		swap(p,q,x);
		if((t=f2(x))<smin) smin=t;
		else swap(p, q,x);
		
	}	
	
	freopen("cc.out","w",stdout);
	printf("%d\n", smin);
}

	
int main()
{
	srand(99);
	freopen("cc.in","r",stdin);
	scanf("%d\n", &n);
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j) scanf("%d ", &a[i][j]);
	
	solve2();
	return 0;
}