比赛 |
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;
}