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

URAL1020 ROPE

时间:2015-07-24 18:16:59      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:



这题题意不难,就是有n个半径一样的圆,,,,一根绳子把它们围起来问最短的绳长,,,,,,,,,,多画画图就能发现的所有外围的圆圈的圆心距离加上2πR,,,


这题数据给的!!!!!必然是凸多边形而且还是按顺序给!!!!!!!!本来我都要怕的不行了看凸包了 !!!!!!!(还有一个坑π要当3.1416算(或者更精确 ),,用DOUBLE)

后面还是附上凸包的东西吧~


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include<bits/stdc++.h>
#include <string.h>

using namespace std;


int main()
{
    int geshu;
    double r;
    scanf("%d%lf",&geshu,&r);
    double w1=2*3.1416*r;
    double a[101][2];
    double w2=0;
    for(int i=0;i<geshu;i++)
    {
        scanf("%lf%lf",&a[i][0],&a[i][1]);
        if(i>0)
        {
            w2+=sqrt((a[i][0]-a[i-1][0])*(a[i][0]-a[i-1][0])+(a[i][1]-a[i-1][1])*(a[i][1]-a[i-1][1]));
        }
    }
    w2+=sqrt((a[0][0]-a[geshu-1][0])*(a[0][0]-a[geshu-1][0])+(a[0][1]-a[geshu-1][1])*(a[0][1]-a[geshu-1][1]));
    printf("%.2lf\n",w1+w2);
    return 0;
}


凸包(找角度。。。。。。。)

 Graham扫描法:
    找出点集p[]中最下面的点(有多个时取最左边的),以该点为极点,求出其他所有点的极角,
显然,极角范围为 [0, 180)度,(这里也可以用叉乘来看)对这些点按极角的升序排序, 先把极点和排序后的第一个点和第二个点入栈,再一次循环(i = 3 -> n-1),若栈顶的两个点和当前的点p[i]这三点连线的方向向顺时针方向偏转,则栈顶元素出栈,直到向逆时针方向偏转或者栈内只有2个元素了,就把当前点p[i]入栈。
最后栈中的元素就是所要求的凸包上的点,这里指的是凸包的极点(直线上的非端点不是凸包的极点)



版权声明:本文为博主原创文章,未经博主允许不得转载。

URAL1020 ROPE

标签:

原文地址:http://blog.csdn.net/zhangwenchi/article/details/47044241

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