codeforces 801D Volatile Kite

题目链接:http://codeforces.com/contest/801/problem/D

题意:给你一个多边形的n个点,点顺时针给出,每个点坐标xi,yi,然后让你求每个点做多移动距离dis,使他还能保持多边形。

分析:当时也不清楚凸包什么的,看了样例,发现和每个点到相邻点构成的直线的距离有关,计算之后发现是一半,然后样例太坑,我计算点到直线的距离算错了,强行求了一波中位线,然后样例是等腰的还过了,记下来,点到直线的距离具体看代码。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct st{
 4     double x, y;
 5 }a[1005];
 6 double dis(double x1,double y1,double x2,double y2,double x,double y){
 7     if(x1!=x2){
 8         double k=(y2-y1)/(x2-x1);
 9         return fabs((y-y1)-k*(x-x1))/sqrt(1+k*k);
10     }
11     else return fabs(x-x1);
12 }
13 int main() {
14     int n;
15     cin>>n;
16     for(int i=0;i<n;i++){
17         cin>>a[i].x>>a[i].y;
18     }
19     double result=1e18;
20     for(int i=0;i<n;i++){
21         double s=dis(a[(i-1+n)%n].x,a[(i-1+n)%n].y,a[(i+1)%n].x,a[(i+1)%n].y,a[i].x,a[i].y)*0.5;
22         result=min(result,s);
23     }
24     printf("%.8lf\n",result);
25     return 0;
26 }
View Code

 

posted @ 2017-05-30 20:53  BadboyQAQ  阅读(130)  评论(0编辑  收藏  举报