标签:div ice cout target name with ref ack scom
要保证每三个点构成的三角形为锐角三角形的最优情况,我们知道锐角三角形中锐角相邻的两条边长度的平方和大于相对的边的平方,由题意可以得出中间点为锐角顶点,并且每个点做为序列的起点是等价的,不妨规定起点是1,然后每次选取与上一个点相距最远的点加入序列中,这样可以保证每两个点之间的距离是相对最优的,即保证了锐角(如果是锐角的话)两边的边尽可能大。
这样考虑感觉F题也不是特别难,也可能是我歪打正着
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N=5007;
const ll mod=998244353;
ll x[N],y[N];
vector<ll>u[N],cost[N];
ll dis(int i,int j)
{
return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
int main(){
IO;
int t=1;
//cin>>t;
while(t--){
int n;
cin>>n;map<int,int>vis,mp;
for (int i = 1; i <= n; ++i)
{
cin>>x[i]>>y[i];
}vector<int>ans;
int s=1;
ans.push_back(s);
vis[1]=1;
for (int i = 1; i < n; ++i)
{
int k=0;
for (int j = 1; j <= n; ++j)
{
if(!vis[j]&&(!k||dis(s,j)>dis(s,k)))
k=j;
}
vis[k]=1;
ans.push_back(k);
s=k;
}
for(auto i:ans)cout<<i<<" ";
cout<<endl;
}
return 0;
}
F. Nezzar and Nice Beatmap - Codeforces Round #698 (Div. 2)
标签:div ice cout target name with ref ack scom
原文地址:https://www.cnblogs.com/KeepInCode/p/14344785.html