比赛 20110724 评测结果 AAAWWWWWWT
题目名称 准备工作 最终得分 30
用户昵称 .Xmz 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-07-24 12:45:23
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <algorithm>

using namespace std;

int n;

struct node
{
	int p,r,d;
}P[101];

bool cmp1(const node &a,const node &b)
{
	return a.r < b.r;
}

bool cmp2(const node &a,const node &b)
{
	return a.r+a.p < b.r+b.p;
}

bool cmp3(const node &a,const node &b)
{
	return a.d > b.d;
}

struct state
{
	int d[101];
	int res;
	
	void cal()
	{
		res=-2000000000;int now=0;
		for (int i=1;i<=n;i++)
		{
			now=max(now,P[d[i]].r)+P[d[i]].p;
			res=max(res,now-P[d[i]].d);
		}
	}
	
	void reset()
	{
		if (rand()%3==1) sort(P+1,P+n+1,cmp1);
		else if (rand() & 1) sort(P+1,P+n+1,cmp2);
		else sort(P+1,P+n+1,cmp3);
		for (int i=1;i<=n;i++) d[i]=i;
		int t=(int)sqrt((float)n);
		for (int i=1;i<=t;i++)
		swap(d[rand()%n+1],d[rand()%n+1]);
		cal();
	}
	
	void change()
	{
		int L=rand()%n+1,R=rand()%n+1;
		if (L>R) swap(L,R);
		for (int i=L;i<=(L+R)/2;i++)
		swap(d[i],d[R+L-i]);
		cal();
	}
	
}New,Best,Now;

void init()
{
	for (int i=1;i<=n;i++) scanf("%d",&P[i].p);
	for (int i=1;i<=n;i++) scanf("%d",&P[i].r);
	for (int i=1;i<=n;i++) scanf("%d",&P[i].d);
	Best.reset();
}

void solve()
{
	Now.reset();
	double T0=(P[n].p+P[n].r-P[n].d)/n,T=T0;
	int ci=7000/(int)sqrt(n);
	for (int i=1;i<=ci;i++)
	{
		New=Now;
		New.change();
		int delta=New.res-Now.res;
		if (delta<0) Now=New;
		else
		{
			double p=exp(-delta/T);
			if (rand()%10001/10000.0<p) Now=New;
		}
		if (Now.res<Best.res) Best=Now;
		T=T0/log(2+i);
	}
}

int main()
{
	freopen("preparation.in","r",stdin);
	freopen("preparation.out","w",stdout);
	srand(time(0));
	do
	{
		scanf("%d",&n);
		if (n==0) break;
		init();
		for (int i=1;i<=10;i++) solve();
		printf("%d\n",Best.res);
	}while(true);
	return 0;
}