35pts求助模拟退火

P4360 [CEOI2004] 锯木厂选址

@[黑影洞人](/user/285617) 优化一下calc
by rabbyte @ 2022-07-21 16:52:02


看能不能O(1)
by rabbyte @ 2022-07-21 16:52:18


@[rabbyte](/user/638235) 优化了,49pts
by 黑影洞人 @ 2022-07-21 16:52:43


@[rabbyte](/user/638235) 改过后的 ```cpp #include<cstdio> #include<algorithm> #include<cstdlib> #include<ctime> #include<cmath> #include<cstring> #define N 114514 #define int long long using namespace std; int xxx,yyy,n,w[N],d[N],s[N],ans,fifi,best; const double eps=1e-12; int calc(){ return s[xxx]*w[xxx]+s[yyy]*(w[yyy]-w[xxx])+s[n+1]*(w[n]-w[yyy])-fifi; } void sa(){ for(double t=1145;t>eps;t*=0.998){ //printf("%d\n",ans); int x=xxx,y=yyy; xxx=rand()%n+1;yyy=rand()%n+1; if(xxx>yyy)swap(xxx,yyy); int now=calc(),del=now-ans; if(del<eps)ans=now; else if(exp(-del/t)*RAND_MAX<rand())xxx=x,yyy=y; best=min(best,ans); } } signed main(){ scanf("%lld",&n); for(int i=1;i<=n;i++){ scanf("%lld%lld",&w[i],&d[i]); s[i]=s[i-1]+d[i-1]; fifi+=s[i]*w[i]; w[i]+=w[i-1]; } s[n+1]=s[n]+d[n]; xxx=1,yyy=2; best=ans=calc(); while((double)clock()/CLOCKS_PER_SEC<=0.67)sa(); printf("%lld",best); return 0; } ```
by 黑影洞人 @ 2022-07-21 16:53:26


@[黑影洞人](/user/285617) 代码
by rabbyte @ 2022-07-21 16:53:31


@[黑影洞人](/user/285617) 您不是A了吗(
by rabbyte @ 2022-07-21 16:58:21


@[rabbyte](/user/638235) 我打了个暴力
by 黑影洞人 @ 2022-07-21 21:15:58


|