結果
| 問題 |
No.5020 Averaging
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-25 16:57:22 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 976 ms / 1,000 ms |
| コード長 | 3,889 bytes |
| コンパイル時間 | 4,397 ms |
| コンパイル使用メモリ | 285,472 KB |
| 実行使用メモリ | 59,948 KB |
| スコア | 37,911,170 |
| 最終ジャッジ日時 | 2024-02-25 16:59:17 |
| 合計ジャッジ時間 | 52,406 ms |
|
ジャッジサーバーID (参考情報) |
judge10 / judge13 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
struct card{
ll a,b;
card(){}
card(ll a,ll b):a(a),b(b){}
void print(){
cout<<a<<" "<<b<<endl;
}
};
bool operator<(card x,card y){
if(x.a==y.a)return x.b<y.b;
else return x.a<y.a;
}
card operator+(card x,card y){
return card((x.a+y.a)/2,(x.b+y.b)/2);
}
const int m=6;
const vector<int> v={45,16,12,9,7,5,1};
const ll x=500000000000000000;
int n;
struct state{
vector<int> chosenindex;
double score;
vector<card> c;
vector<pair<int,int>> operations;
void calc_score(){
score=0;
double s=0;
for(int i:chosenindex)score+=max(abs(c[i].a-x),abs(c[i].b-x));
score+=max(abs(c[0].a-x),abs(c[0].b-x))*(chosenindex.size()-1);
score/=chosenindex.size();
for(int i:chosenindex)s+=(max(abs(c[i].a-x),abs(c[i].b-x))-score)*(max(abs(c[i].a-x),abs(c[i].b-x))-score);
s/=chosenindex.size();
//score+=s/100000;
}
state generate(vector<int>& indexes){
state res;
res.chosenindex.resize(indexes.size());
res.operations=operations;
res.c=c;
int t=0;
for(int i:indexes){
res.chosenindex[t]=chosenindex[i];
t++;
}
for(int p:res.chosenindex){
card t=res.c[p]+res.c[(p+1)%n];
int index=(p+1)%n;
for(int j=2;j<n;j++){
card tt=res.c[p]+res.c[(p+j)%n];
if(max(abs(t.a-x),abs(t.b-x))>max(abs(tt.a-x),abs(tt.b-x))){
index=(p+j)%n;
t=tt;
}
}
res.c[p]=t;
res.c[index]=t;
res.operations.push_back(make_pair(p+1,index+1));
}
res.calc_score();
return res;
}
};
bool operator<(state p,state q){
return p.score<q.score;
}
ll solver(int n,vector<card> c){
auto f=[&](int p){
card t=c[p]+c[(p+1)%n];
int index=(p+1)%n;
for(int j=2;j<n;j++){
card tt=c[p]+c[(p+j)%n];
if(max(abs(t.a-x),abs(t.b-x))>max(abs(tt.a-x),abs(tt.b-x))){
index=(p+j)%n;
t=tt;
}
}
c[p]=t;
c[index]=t;
cout<<p+1;
cout<<" ";
cout<<index+1<<endl;
};
for(int i=0;i<m;i++){
for(int j=0;j<v[i];j++){
f(j);
}
}
return max(abs(c[0].a-x),abs(c[0].b-x));
}
int main(){
cin>>n;
vector<card> c(n);
random_device seed;
mt19937 rnd(seed());
for(int i=0;i<n;i++){
ll a,b;
cin>>a>>b;
c[i]=card(a,b);
}
cout<<50<<endl;
//const int bc=100;
const vector<int> bc={1,250,200,100,50,30,1};
vector<state> beam(1);
state c0;
c0.c=c;
c0.chosenindex.resize(n);
for(int i=0;i<n;i++)c0.chosenindex[i]=i;
beam[0]=c0;
for(int i=0;i<m;i++){
vector<state> new_beam(bc[i]*bc[i+1]);
for(int j=0;j<bc[i+1];j++){
set<int> indexes;
vector<int> vv(v[i+1]);
indexes.insert(0);
for(int k=0;k+1<v[i+1];k++){
int t=rnd()%v[i+1];
while(indexes.count(t))t=rnd()%v[i];
indexes.insert(t);
vv[k]=t;
}
vv[v[i+1]-1]=0;
int t=rnd()%(v[i+1]);
for(int k=v[i+1]-1;k>t;k--){
swap(vv[k],vv[k-1]);
}
for(int k=0;k<bc[i];k++){
new_beam[k*bc[i+1]+j]=beam[k].generate(vv);
}
}
sort(new_beam.begin(),new_beam.end());
new_beam.resize(bc[i+1]);
beam=new_beam;
}
for(int i=0;i<50;i++){
cout<<beam[0].operations[i].first;
cout<<" ";
cout<<beam[0].operations[i].second;
cout<<endl;
}
cout<<beam[0].score<<endl;
}