码迷,mamicode.com
首页 > 其他好文 > 详细

F. Nezzar and Nice Beatmap - Codeforces Round #698 (Div. 2)

时间:2021-01-30 11:50:37      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:div   ice   cout   target   name   with   ref   ack   scom   

F. Nezzar and Nice Beatmap

https://codeforces.com/contest/1478/problem/F

题解

要保证每三个点构成的三角形为锐角三角形的最优情况,我们知道锐角三角形中锐角相邻的两条边长度的平方和大于相对的边的平方,由题意可以得出中间点为锐角顶点,并且每个点做为序列的起点是等价的,不妨规定起点是1,然后每次选取与上一个点相距最远的点加入序列中,这样可以保证每两个点之间的距离是相对最优的,即保证了锐角(如果是锐角的话)两边的边尽可能大。
这样考虑感觉F题也不是特别难,也可能是我歪打正着

Code

#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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!