题目大意:n个点连起来(首尾不相连),每三个点之间的夹角不超过90度

 

 题目链接

 

解题思路:考虑每次连线和距离当前点最远的点连线,保证了有解。

三个点连成三角形,当这个三角形是钝角三角形时才可能出现无解,但每次选择最远的点连线,保证了不可能选择到钝角。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 using namespace std;
 5 typedef long long ll;
 6 const int maxn=5e3+5;
 7 struct node{
 8     int x,y;
 9 }a[maxn];
10 int vis[maxn];
11 int main()
12 {
13     int n;
14     scanf("%d",&n);
15     memset(vis,0,sizeof(vis));
16     for(int i=1;i<=n;i++){
17         scanf("%d%d",&a[i].x,&a[i].y);
18     }
19     int ans=1;
20     ll tmp;
21     for(int i=1;i<=n;i++){
22         tmp=0;
23         int k=-1;
24         for(int j=1;j<=n;j++){
25             if(vis[j]) continue;
26             if(1LL*abs(a[ans].x-a[j].x)*abs(a[ans].x-a[j].x)+1LL*abs(a[ans].y-a[j].y)*abs(a[ans].y-a[j].y)>tmp){
27                 k=j;
28                 tmp=1LL*abs(a[ans].x-a[j].x)*abs(a[ans].x-a[j].x)+1LL*abs(a[ans].y-a[j].y)*abs(a[ans].y-a[j].y);
29             }
30         }
31         ans=k;
32         printf("%d ",ans);
33         vis[ans]=1;
34     }
35     return 0;
36 }
View Code

 

 posted on 2021-02-01 19:04  haianx  阅读(79)  评论(0编辑  收藏  举报