rt,本人在两天前加入洛谷比赛(我没去参加比赛本身),得了210分,T3没做,然后比赛后想出这么个疯狂的办法然后得了75分……
#include<iostream>
#include<cmath>
#include<random>
#include<algorithm>
using namespace std;
clock_t cl;
int n,tmp;
double cur;
random_device rd;
const int N=1e4+10;
struct st{
int id;
double first,second;
bool operator<(const st& x){
return second>x.second;
}
};
inline double dis(st a,st b){
return sqrt(abs(a.first-b.first)*abs(a.first-b.first)+abs(a.second-b.second)*abs(a.second-b.second));
}
st pos[N];
vector<int> tra;
int main(){
cl=clock();
scanf("%d",&n);
if(!n)return 0;
scanf("%lf%lf",&pos[1].first,&pos[1].second);
pos[1].id=1;
for(int i=2;i<=n;i++){
scanf("%lf%lf",&pos[i].first,&pos[i].second);
pos[i].id=i;
}
sort(pos+1,pos+n+1);
tra.push_back(0);
tra.push_back(pos[1].id);
for(int i=2;i<=n;i++){
cur+=dis(pos[i],pos[i-1]);
tra.push_back(pos[i].id);
}
while(clock()-cl<0.95*CLOCKS_PER_SEC){
tmp=rd()%(n-2)+1;
if(dis(pos[tmp],pos[tmp+1])>dis(pos[tmp],pos[tmp+2])){
cur-=dis(pos[tmp],pos[tmp+1]);
cur+=dis(pos[tmp],pos[tmp+2]);
swap(tra[tmp+1],tra[tmp+2]);
}
}
for(int i=1;i<=n;i++)printf("%d ",tra[i]);
}