关于春测 T3
  • 板块学术版
  • 楼主Windy_YY
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/3/5 17:40
  • 上次更新2023/10/23 22:56:42
查看原帖
关于春测 T3
378467
Windy_YY楼主2023/3/5 17:40
#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

2023/3/5 17:40
加载中...