这题题意不难,就是有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]入栈。
最后栈中的元素就是所要求的凸包上的点,这里指的是凸包的极点(直线上的非端点不是凸包的极点)