結果
問題 |
No.5020 Averaging
|
ユーザー |
|
提出日時 | 2024-02-25 16:40:26 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 928 ms / 1,000 ms |
コード長 | 3,691 bytes |
コンパイル時間 | 4,201 ms |
コンパイル使用メモリ | 284,988 KB |
実行使用メモリ | 59,948 KB |
スコア | 23,437,806 |
最終ジャッジ日時 | 2024-02-25 16:41:39 |
合計ジャッジ時間 | 52,831 ms |
ジャッジサーバーID (参考情報) |
judge12 / judge14 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
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/=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; 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; }