注意到并非单峰函数,决定使用模拟退火,请求帮忙调参 记录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;
}