hdu 4410 Boomerang (2012杭州网络赛1001)
2012-09-24 01:11
387 查看
这题简直是个大坑,比赛时做了两个多小时,写了两百多行代码,各种调,就是没做出来。。。
比完赛晚上十点多开始重写,写到半夜一点,终于过了!!!
思路:枚举所有情况,n=4一种,n=6一种,n=8四种。
先给组数据
8 -3 9 0 9 0 0 9 0 9 -2 1 -2 1 -1 -3 -1
8 -3 9 0 9 0 0 9 0 9 -4 1 -4 1 -1 -3 -1
8 3 0 4 0 4 1 8 1 8 2 4 2 4 3 3 3
8 0 0 6 0 6 3 10 3 10 4 5 4 5 2 0 2
8 0 0 2 0 2 19 3 19 3 40 1 40 1 20 0 20
0
结果是
3.16
4.00
2.24
2.24
2.24
下面是代码:
比完赛晚上十点多开始重写,写到半夜一点,终于过了!!!
思路:枚举所有情况,n=4一种,n=6一种,n=8四种。
先给组数据
8 -3 9 0 9 0 0 9 0 9 -2 1 -2 1 -1 -3 -1
8 -3 9 0 9 0 0 9 0 9 -4 1 -4 1 -1 -3 -1
8 3 0 4 0 4 1 8 1 8 2 4 2 4 3 3 3
8 0 0 6 0 6 3 10 3 10 4 5 4 5 2 0 2
8 0 0 2 0 2 19 3 19 3 40 1 40 1 20 0 20
0
结果是
3.16
4.00
2.24
2.24
2.24
下面是代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const double EP=1e-8; struct Point{ int x, y; }p[15], pt[15]; struct Segline{ Point s, e; }s1, s2; int n; void init(){ for(int i=0; i<n; i++){ scanf("%d%d", &p[i].x, &p[i].y); } } double x_mult(Point sp, Point ep, Point op){ return 1.0*(sp.x-op.x)*(ep.y-op.y)-1.0*(sp.y-op.y)*(ep.x-op.x); } double dist(Point a,Point b){ return sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y)); } int pre(int i){return (i-1+n)%n;} int next(int i){return (i+1)%n;} bool intersect(Segline l1, Segline l2){ if((x_mult(l1.s,l2.e,l2.s)*x_mult(l1.e,l2.e,l2.s)<-EP)&& (x_mult(l2.s,l1.e,l1.s)*x_mult(l2.e,l1.e,l1.s)<-EP)) return true; return false; } bool is_cancave(int i){ if(x_mult(p[pre(i)], p[i], p[next(i)])<0) return true; else return false; } bool seg_cross(int t1, int t2){ s1.s=p[t1];s1.e=p[t2]; for(int i=0; i<n; i++){ s2.s=p[i];s2.e=p[(i+1)%n]; if(intersect(s1, s2)) return true; } return false; } void solve(){ double ans, tmp; int i, flag[12], cnt=0, mid; for(i=0; i<n; i++){ if(x_mult(p[pre(i)], p[i], p[next(i)])>0) cnt++; } if(cnt<=4){ for(i=0; i<n; i++){ pt[n-i-1]=p[i]; } memcpy(p, pt, sizeof(pt)); } cnt=0; if(n==4){ ans=min(dist(p[0], p[1]), dist(p[1], p[2])); } else if(n==6){ for(i=0; i<n; i++){ if(is_cancave(i)){ ans=min(dist(p[(i+3)%n], p[i]), min(dist(p[(i+3)%n], p[(i+4)%n]), dist(p[(i+3)%n], p[(i+2)%n]))); } } } else if(n==8){ for(i=0; i<n; i++){ if(is_cancave(i)) flag[cnt++]=i; } if(flag[1]<flag[0])swap(flag[0], flag[1]); if(flag[1]-flag[0]==2||flag[1]-flag[0]==n-2){ if(flag[1]-flag[0]==2)mid=(flag[0]+1)%n; else mid=(flag[0]-1+n)%n; ans=min(min(dist(p[(mid+3)%n], p[(mid+4)%n]), dist(p[(mid-3+n)%n], p[(mid+4)%n])) , min(dist(p[(mid+1)%n], p[(mid+4)%n]), dist(p[(mid-1+n)%n], p[(mid+4)%n]))); } else if(flag[1]-flag[0]==4||flag[1]-flag[0]==n-4){ if(p[(flag[1]+1)%n].x==p[(flag[1]+2)%n].x){ tmp=fabs(0.0+p[(flag[1]+1)%n].x-p[(flag[1]-2+n)%n].x); tmp=min(tmp, fabs(0.0+p[(flag[1]+2)%n].y-p[(flag[1]-1+n)%n].y)); } else { tmp=fabs(0.0+p[(flag[1]+1)%n].y-p[(flag[1]-2+n)%n].y); tmp=min(tmp, fabs(0.0+p[(flag[1]+2)%n].x-p[(flag[1]-1+n)%n].x)); } ans=tmp; double t1, t2, t3, t4; t1=dist(p[(flag[1]+3)%n], p[flag[1]]);t2=dist(p[(flag[1]-3+n)%n], p[flag[1]]); t3=dist(p[(flag[0]+3)%n], p[flag[0]]);t4=dist(p[(flag[0]-3+n)%n], p[flag[0]]); if(seg_cross((flag[1]+3)%n, flag[1]))t1=min(dist(p[flag[0]], p[(flag[1]+1)%n]), dist(p[(flag[1]+1)%n], p[(flag[1]+2)%n])); if(seg_cross((flag[1]-3+n)%n, flag[1]))t2=min(dist(p[flag[0]], p[(flag[1]-1+n)%n]), dist(p[(flag[1]-1+n)%n], p[(flag[1]-2+n)%n])); if(seg_cross((flag[0]+3)%n, flag[0]))t3=min(dist(p[flag[1]], p[(flag[0]+1)%n]), dist(p[(flag[0]+1)%n], p[(flag[0]+2)%n])); if(seg_cross((flag[0]-3+n)%n, flag[0]))t4=min(dist(p[flag[1]], p[(flag[0]-1+n)%n]), dist(p[(flag[0]-1+n)%n], p[(flag[0]-2+n)%n])); tmp=max(min(t1, t4), min(t3, t2)); ans=min(ans, tmp); } else if(flag[1]-flag[0]==1||flag[1]-flag[0]==n-1){ if(flag[1]-flag[0]==1){ tmp=min(max(dist(p[(flag[0]-2+n)%n], p[(flag[0]-3+n)%n]), dist(p[(flag[1]+2)%n], p[(flag[1]+3)%n])) , dist(p[(flag[0]-3)%n], p[(flag[1]+3)%n])); ans=min(tmp, max(dist(p[(flag[0])%n], p[(flag[0]-3+n)%n]), dist(p[(flag[1])%n], p[(flag[1]+3)%n]))); } else { tmp=min(max(dist(p[(flag[1]-2+n)%n], p[(flag[1]-3+n)%n]), dist(p[(flag[0]+2)%n], p[(flag[0]+3)%n])) , dist(p[(flag[1]-3)%n], p[(flag[0]+3)%n])); ans=min(tmp, max(dist(p[(flag[1])%n], p[(flag[1]-3+n)%n]), dist(p[(flag[0])%n], p[(flag[0]+3)%n]))); } } else { if(flag[1]-flag[0]==3){ if(p[(flag[0]+1)%n].x==p[(flag[0]+2)%n].x) tmp=fabs(0.0+p[(flag[0]+1)%n].x-p[(flag[0]-2+n)%n].x); else tmp=fabs(0.0+p[(flag[0]+1)%n].y-p[(flag[0]-2+n)%n].y); ans=min(tmp, min(dist(p[(flag[0])%n], p[(flag[0]-3+n)%n]), dist(p[(flag[1])%n], p[(flag[1]+3)%n]))); } else { if(p[(flag[1]+1)%n].x==p[(flag[1]+2)%n].x) tmp=fabs(0.0+p[(flag[1]+1)%n].x-p[(flag[1]-2+n)%n].x); else tmp=fabs(0.0+p[(flag[1]+1)%n].y-p[(flag[1]-2+n)%n].y); ans=min(tmp, min(dist(p[(flag[1])%n], p[(flag[1]-3+n)%n]), dist(p[(flag[0])%n], p[(flag[0]+3)%n]))); } } } printf("%.2f\n", ans); } int main(){ //freopen("1.txt", "r", stdin); while(scanf("%d", &n)&&n){ init(); solve(); } return 0; }
相关文章推荐
- HDU 4410 Boomerang(计算几何)(2012杭州网络赛1001)
- hdu 4417 2012杭州网络赛
- HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)
- hdu 4412 2012杭州赛区网络赛 期望
- HDU 4416 Good Article Good sentence 2012 杭州网络赛
- HDU 4417 Super Mario(2012杭州网络赛 H 离线线段树)
- hdu 4419 2012杭州网络赛
- HDU 4417 Super Mario(2012杭州网络赛 H 离线线段树)
- hdu 4414 2012杭州网络赛
- hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***
- hdu 4417 2012杭州网络赛 划分树
- HDU 4279 2012网络赛Number(数论 欧拉函数结论约数个数)
- hdu 4296 (成都赛区2012网络赛)
- hdu 4277 USACO ORZ(2012 ACM/ICPC Asia Regional Changchun Online 长春网络赛)
- 长春赛区2012 A Simple Problem with Integers 1001题 (网络赛)
- HDU 4416 Good Article Good sentence(12年杭州网络赛-G题-SA)
- hdu 4576 robot 2013 ACM-ICPC杭州赛区全国邀请赛——题目重现-1001-robot
- 2017沈阳网络赛 1001 HDU 6194 string string string(后缀自动机 出现k次的子串个数)
- HDU4414 2012ACM/ICPC杭州赛区网络赛E Finding crosses
- HDU 2013 杭州网络赛 1007 & HDU 4744 Starloop System