A - Wall解题报告(来自网络)
来源:互联网 发布:阿里云优惠口令看不懂 编辑:程序博客网 时间:2024/04/27 17:46
解题思路:先用Graham找出凸包,并算出凸包的周长再加上一个以L为半径的圆的周长就是所求的答案,因为凸多边形的内角和为(n-2)*180,n*360-(2*90)*n-(n-2)*180=360,刚好是一个完整的圆。
代码
#include<stdio.h>#include<math.h>#include<stdlib.h>#define PI 3.14159265358979#define exchange(a, b) {point t;t=a; a=b; b=t;}const int maxN = 1000;typedef struct {long x;long y;}point;int N, L, top=0;point pl[maxN+1];double direction(point p1, point p2, point p3, point p4) {return (p2.x-p1.x)*(p4.y-p3.y)-(p4.x-p3.x)*(p2.y-p1.y);}double dis(point p1, point p2) {return sqrt(1.0*(p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));}int cmp(const void * arg1, const void * arg2) {point *a, *b;double d, dis1, dis2;a = (point *)arg1;b = (point *)arg2;d = direction(pl[1], *b, pl[1], *a);dis1 = dis(pl[1], *a);dis2 = dis(pl[1], *b);if( d!=0 ) { return (int)d;}else if(dis1 > dis2){ return 1;}else if(dis1 <dis2 ) { return -1;}else { return 0;}}void push(point stack[], point p) {top++;stack[top] = p;}point pop(point stack[]) {top--;return stack[top+1];}int Graham_scan(point stack[]) {int i;push(stack, pl[1]);push(stack, pl[2]);for ( i=3; i<=N; i++ ) { while(top>=2 && direction(stack[top-1], stack[top], stack[top], pl[i])<=0 ) { pop(stack); } push(stack, pl[i]);}return top;}int main() {int i, num;point stack[maxN+1];double d=0;freopen("input.in", "r", stdin);scanf("%d%d",&N, &L);for ( i=1; i<=N; i++ ) { scanf("%d%d", &pl[i].x, &pl[i].y); if(i>1 && (pl[i].y<pl[1].y || (pl[i].y==pl[1].y && pl[i].x<pl[1].x))) { exchange(pl[i], pl[1]); }}qsort((void *)(pl+2), N-1, sizeof(point), cmp);num = Graham_scan(stack);for ( i=1; i<num; i++ ) { //计算凸多边形的边长 d += dis(stack[i], stack[i+1]);}d += dis(stack[1], stack[num]);d += (2*PI*L); //加上圆的周长printf("%.f\n", d);return 0;}
- A - Wall解题报告(来自网络)
- E - Biorhythms解题报告(来自网络)
- F - Dividing解题报告(来自网络)
- F - Summits解题报告(来自网络)
- E - Pipe解题报告(来自网络)
- N - TOYS解题报告(来自网络)
- C - Binary Stirling Numbers解题报告(来自网络)
- D - Magic Bracelet解题报告(来自网络)
- I - An Easy Problem!解题报告(来自网络)
- B - Run Away解题报告(来自网络)
- G - Islands and Bridges解题报告(来自网络)
- K - Parallelogram Counting解题报告(来自网络)
- M - Toy Storage解题报告(来自网络)
- C - How I Mathematician Wonder What You Are!解题报告(来自网络)
- 【解题报告】 POJ 1113 Wall -- 求凸包周长
- [Leetcode] 554. Brick Wall 解题报告
- pku 1087 A Plug for UNIX 网络流 解题报告
- 多校训练赛 Furude_Rika and wall 解题报告(dp)
- 梦入IBM之java基础第五天
- 黑马程序员_正则表达式
- 中医揭秘:十二星座体质容易得什么病
- 在编爱恩斯坦棋(3)
- 十二星座养生保健法
- A - Wall解题报告(来自网络)
- B - Scrambled Polygon
- C - How I Mathematician Wonder What You Are!解题报告(来自网络)
- D - Area解题报告(熊禾强)
- E - Pipe解题报告(来自网络)
- F - Pipe Fitters解题报告(熊禾强)
- G - There's Treasure Everywhere!解题报告(熊禾强)
- H - Area in Triangle解题报告(熊禾强)
- I - I Think I Need a Houseboat解题报告(熊禾强)