门芯初学2ms,求调教❤
查看原帖
门芯初学2ms,求调教❤
534562
liheyang123楼主2024/12/1 12:20

注意到并非单峰函数,决定使用模拟退火,请求帮忙调参 记录1 70pts

记录2 74pts

记录3 0pts

3次提交的区别为

记录1

if(clock()/CLOCKS_PER_SEC>=2.0) {
  printf("%lld",answ);
  exit(0);
}

记录2

if(clock()/CLOCKS_PER_SEC>=2.5) {
  printf("%lld",answ);
  exit(0);
}

记录3

if(clock()/CLOCKS_PER_SEC>=2.8) {
  printf("%lld",answ);
  exit(0);
}

代码
```cpp#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> PII;
const int N=1e5+5e4+10;
const ld BT=1000;
const ld ET=0.1;//1e-6;
const ld CT=0.96;
ll n;
PII a[N];
ll as[N],bs[N];
ll answ,ansaid,ansbid;
ll maxa,maxb;

inline ll f(PII x,ll a,ll b) {
	return (x.first>=a?a:(x.second>=b)?b:0);
}

inline ll calc(ll x,ll y) {
	ll res=0;
	for(int i=1; i<=n; i++)res+=f(a[i],x,y);
	return res;
}

inline int ran(ll x,ll y) {
	if(x==y)return x;
	return rand()%(x-y)+x;
}

inline void sa() {
	while(1) {
		ll tmpw=answ,tmpaid=ansaid,tmpbid=ansbid;
		for(ld T=BT; T>=ET; T*=CT) {
			//	cout<<T<<'\n';
			//	ll newa=ran(max(0ll,tmpa-(ll)(T*10)),min(maxa,tmpa+(ll)(T*10)));
			//	ll newb=ran(max(0ll,tmpa-(ll)(T*10)),min(maxb,tmpb+(ll)(T*10)));
			ll newaid=ran(max(0ll,tmpaid-(ll)T),min(n,tmpaid+(ll)T));
			ll newbid=ran(max(0ll,tmpbid-(ll)T),min(n,tmpbid+(ll)T));
			ll newa=as[newaid];
			ll newb=bs[newbid];
			ll neww=calc(newa,newb);
			//	cout<<newa<<' '<<newb<<' '<<neww<<' '<<T<<'\n';
			ll delta=neww-tmpw;
			if(delta>0) {
				tmpw=neww;
				tmpaid=newaid;
				tmpbid=newbid;
			} else if(exp(-delta*(1.0)/T)<=rand()/RAND_MAX) {
				tmpw=neww;
				tmpaid=newaid;
				tmpbid=newbid;
			}
			if(tmpw>answ) {
				answ=tmpw;
				ansaid=tmpaid;
				ansbid=tmpbid;
			}
			T=floor(T*10)/10;
		}
		if(clock()/CLOCKS_PER_SEC>=2.8) {
			printf("%lld",answ);
			//	cout<<' '<<ansaid<<' '<<ansbid;
			//	return;
			exit(0);
		}
	}
}

int main() {
//	freopen("consume.in","r",stdin);
//	freopen("consume.out","w",stdout);
	srand(time(0));
	scanf("%d",&n);
	for(int i=1; i<=n; i++) {
		scanf("%lld%lld",&a[i].first,&a[i].second);
		//	ansa+=a[i].first,ansb+=a[i].second;
		as[i]=a[i].first,bs[i]=a[i].second;
		//	maxa=max(maxa,a[i].first);
		//	maxb=max(maxb,a[i].second);
	}
	sort(as+1,as+n+1);
	sort(bs+1,bs+n+1);
	ansaid=n>>1;
	ansbid=n>>1;
	answ=calc(as[ansaid],bs[ansbid]);
//	cout<<answ<<'\n';
	sa();
	return 0;
}

2024/12/1 12:20
加载中...