题目大意: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 }