結果
| 問題 |
No.5020 Averaging
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-25 15:52:16 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 411 ms / 1,000 ms |
| コード長 | 3,265 bytes |
| コンパイル時間 | 4,104 ms |
| コンパイル使用メモリ | 284,220 KB |
| 実行使用メモリ | 19,844 KB |
| スコア | 21,702,023 |
| 最終ジャッジ日時 | 2024-02-25 15:53:25 |
| 合計ジャッジ時間 | 25,860 ms |
|
ジャッジサーバーID (参考情報) |
judge11 / judge10 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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={50,15,12,10,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;
for(int i:chosenindex)score+=max(abs(c[i].a-x),abs(c[i].b-x));
}
state generate(set<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;
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(min((int)beam.size(),100)*100);
for(int j=0;j<100;j++){
set<int> indexes;
for(int k=0;k<v[i+1];k++){
int t=rnd()%v[i+1];
while(indexes.count(t))t=rnd()%v[i+1];
indexes.insert(t);
}
for(int k=0;k<min(100,(int)beam.size());k++){
new_beam[k*100+j]=beam[k].generate(indexes);
}
}
sort(new_beam.begin(),new_beam.end());
new_beam.resize(100);
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;
}
}