Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
历时3个小时……终于T T#include<stdio.h> #include<math.h> int main() { freopen("in.txt","r",stdin); double result = 0.0; int stack[1001] = {0}; int ptr = 0; int point[1001][2]; bool In_Circle[1001] = {false}; int R,n,nextp = 0,now; int maxy = 100000,my = 0; scanf("%d %d",&n,&R); for(int i = 1;i <= n;i ++) { scanf("%d %d",&point[i][0],&point[i][1]); if(point[i][1] < maxy) { my = i; maxy = point[i][1]; } } double rad[1001] = {0.0}; int prev[2] = {1,0}; int nowv[2]; now = my;//start from my stack[0] = my; do { double maxr = -2.0; int maxrp = now; for(int i = 1;i <= n;i ++) { if(!In_Circle[i] && i != now) { nowv[0] = point[i][0] - point[now][0]; nowv[1] = point[i][1] - point[now][1]; double dy = (double)((nowv[0]) * (prev[0]) + (nowv[1] * prev[1])); double len = (double)(nowv[0] * nowv[0] + nowv[1] * nowv[1]) * (prev[0] * prev[0] + prev[1] * prev[1]); rad[i] = (dy / sqrt(len)); if(maxr < rad[i]) { maxr = rad[i]; maxrp = i; } } } stack[++ptr] = maxrp; In_Circle[maxrp] = true; prev[0] = point[maxrp][0] - point[now][0]; prev[1] = point[maxrp][1] - point[now][1]; now = maxrp; }while(now != my); result += R * acos(prev[0] * 1.0 / sqrt((double)(prev[0] * prev[0] + prev[1] * prev[1]))); while(ptr) { result += acos(rad[stack[ptr]]) * R; result += sqrt((double)((point[stack[ptr]][0] - point[stack[ptr - 1]][0]) * (point[stack[ptr]][0] - point[stack[ptr - 1]][0]) + (point[stack[ptr]][1] - point[stack[ptr - 1]][1]) * (point[stack[ptr]][1] - point[stack[ptr - 1]][1]))); ptr --; } printf("%.0lf",result); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator