zoj 2157 || poj 1788 Building a New Depot

给你N个点,求出这些点组成的图形的周长,凸凹都可能。

 

会升提的这个题。。。><。。我承认木有认真看题,没注意这些点都在拐点上,会升说了他的想法,现在重新看题后,觉得应该是对的。

 

因为这些点必须在拐点上,所以,排序后,每一行的点必须为偶数个。因为是连通块,所以,这一行的第一个点和第二个点必须有线,二三之间必然在这一行不存在连接的线。。。以此类推。。

 

而因为总个数是偶数,所以只用考虑第i和 i+1连线,i+2和i+3连线即可。

 

提供几组数据~

 

 

12

2 3

3 3

2 4

3 4

1 2

1 3

2 1

2 2

3 1

3 2

4 2

4 3

 

the answer is : 12

 

 

8

1 1 

0 1 

0 2

2 1

3 1

2 2

1 0

3 0

 

the answer is : 10

 

12

2 0

3 0

0 1

2 1

0 2

1 2

0 3

1 3

2 3

3 3

0 4 

2 4

 

the answer is : 16

 

 

#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; const int MAX = 100010; struct point{ int x,y;}; point p[MAX]; bool cmp(point a,point b) { if( a.y == b.y ) return a.x < b.x; return a.y < b.y; } bool cmp1(point a,point b) { if( a.x == b.x ) return a.y < b.y; return a.x < b.x; } int main() { int n; while( ~scanf("%d",&n) && n ) { for(int i=0; i<n; i++) scanf("%d %d",&p[i].x,&p[i].y); sort(p,p+n,cmp); int sum = 0; for(int i=0; i<n; i+=2) sum += (p[i+1].x - p[i].x); sort(p,p+n,cmp1); for(int i=0; i<n; i+=2) sum += (p[i+1].y - p[i].y); printf("The length of the fence will be %d units./n",sum); } return 0; }  

 

 

你可能感兴趣的:(struct,图形)