#include<bits/stdc++.h>
using namespace std;
int countBIT(int x){
int cnt=0;
while(x){
if(x&1)cnt++;
x/=2;
}
return cnt;
}
const int N=19,M=1010;
double f[1<<N][N];
pair<int,int>pre[1<<N][N];
struct Node{
double x,y;
}z[M];
double dis(int i,int j){
return sqrt(pow(z[i].x-z[j].x,2)+pow(z[i].y-z[j].y,2));
}
void dfs(int state,int id){
if(!state)return;
dfs(pre[state][id].first,pre[state][id].second);
cout<<id+1<<' ';
}
bool check2(int n){
for(int i=1;i<n;i++)
if(z[i].x<z[i-1].x)return false;
for(int i=1;i<n;i++)
if(z[i].y>z[i-1].y)return false;
return true;
}
signed main(){
// freopen("tree.in","r",stdin);
// freopen("tree.out","w",stdout);
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>z[i].x>>z[i].y;
int k=0;
int mxvc=z[0].y;
for(int i=1;i<n;i++)
if(mxvc<z[i].y){
mxvc=z[i].y;
k=i;
}
if(n<=18){
//f[i][j]表示当前选择的是i号点,状态是j
for(int i=0;i<(1<<n);i++)
for(int j=0;j<18;j++)
f[i][j]=1e12;
f[1<<k][k]=0;
pre[1<<k][k]={0,k};
for(int state=1;state<(1<<n);state++)
for(int i=0;i<n;i++)
if(state&(1<<i))
for(int j=0;j<n;j++)
if(~state&(1<<j)){
if(f[state|(1<<j)][j]>f[state][i]+dis(i,j)){
f[state|(1<<j)][j]=f[state][i]+dis(i,j);
pre[state|(1<<j)][j]={state,i};
}
}
double mi=1e12;
int id=-1;
for(int i=0;i<n;i++){
double res=f[(1<<n)-1][i];
if(res<mi){
mi=res;
id=i;
}
}
dfs((1<<n)-1,id);
cout<<'\n';
}else if(!check2(n)){
int pt=k;
int cnt=1;
cout<<pt+1<<' ';
set<int>se;
se.insert(pt);
while(cnt<n){
cnt++;
double mi=1e12;
for(int i=0;i<n;i++)
if(!se.count(i)){
double rr=dis(pt,i);
if(rr<mi){
mi=rr;
pt=i;
}
}
cout<<pt+1<<' ';
se.insert(pt);
}
cout<<'\n';
}else{
for(int i=1;i<=n;i++)
cout<<i<<' ';
cout<<'\n';
}
return 0;
}
这个不应该至少拿80分的吗,为啥只有65分。。
按说至少AC 1~16 实际AC 1~13