CF 75E 题解 Ship's Shortest Path
来源:互联网 发布:哪款root软件最好 编辑:程序博客网 时间:2024/04/29 18:20
给定两点,问两点经过一个多边形的最小花费,可以选择绕边走,花费是1,或者选择直接穿过多边形,花费是2,在多边形内部的花费是路程乘2
简单题。。就是分类讨论
1.两点确定的线段未经过多边形,花费=长度
2.线段穿过多边形,花费=min(线段在多边形外的长+在多边形内的长*2,线段在多边形外的长+多边形较小那一半的周长)
#include<iostream>#include<math.h>#include<algorithm>#include<stdio.h>using namespace std;#define eps 1e-8int sig(double x){return (x>eps)-(x<-eps);}struct P{ double x,y; P(double a=0,double b=0):x(a),y(b){} P operator +(const P &a)const{ return P(x+a.x,y+a.y); } P operator -(const P &a)const{ return P(x-a.x,y-a.y); } P operator *(const double a)const{ return P(x*a,y*a); } P operator /(const double a)const{ return P(x/a,y/a); } double operator *(const P &a)const{ return x*a.x+y*a.y; } double operator ^(const P &a)const{ return x*a.y-y*a.x; } int operator ==(const P &a)const{ return sig(x-a.x)==0&&sig(y-a.y)==0; }};struct Plane{ double a,b,c; Plane(P p,P q) { a=p.y-q.y; b=q.x-p.x; c=(p^q); } Plane(double aa,double bb,double cc) { a=aa;b=bb;c=cc; }};double calc(Plane l,P a){ return a.x*l.a+a.y*l.b+l.c;}P inter(P a,P b,Plane L){ P res; double t1=calc(L,a),t2=calc(L,b); res.x=(t2*a.x-t1*b.x)/(t2-t1); res.y=(t2*a.y-t1*b.y)/(t2-t1); return res;}int cut(P *a,Plane &L,int n,P *res){ int cnt=0; for(int i=0;i<n;i++) { if(calc(L,a[i])<-eps) res[cnt++]=a[i]; else { int j; j=i-1; if(j<0) j=n-1; if(calc(L,a[j])<-eps) res[cnt++]=inter(a[j],a[i],L); j=i+1; if(j==n) j=0; if(calc(L,a[j])<-eps) res[cnt++]=inter(a[i],a[j],L); } } return cnt;}double dis(P a,P b){ return sqrt((b-a)*(b-a));}double cal(P *p,int n){ double sum=0; p[n]=p[0]; for(int i=1;i<=n;i++) { sum+=dis(p[i],p[i-1]); } return sum;}P p[40],q1[40],q2[40];int main(){ int n; P a,b; while(scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y)!=EOF) { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); p[n]=p[0]; Plane l1=Plane(a,b); Plane l2=Plane(b,a);// cout<<l1.a<<" "<<l1.b<<" "<<l1.c<<endl;// cout<<l2.a<<" "<<l2.b<<" "<<l2.c<<endl; int m1=cut(p,l1,n,q1); int m2=cut(p,l2,n,q2); if(m1==0||m2==0) { printf("%lf\n",dis(a,b)); continue; }// cout<<m1<<" "<<m2<<endl;// for(int i=0;i<m1;i++)// cout<<q1[i].x<<" "<<q1[i].y<<endl;// for(int i=0;i<m2;i++)// cout<<q2[i].x<<" "<<q2[i].y<<endl; int t=0; P pp[4]; double sum1=cal(q1,m1),sum2=cal(q2,m2),sum3=0,sum=0; for(int i=0;i<m1;i++) { for(int j=0;j<m2;j++) { if(q1[i]==q2[j]) pp[t++]=q1[i]; } } if(dis(a,b)<dis(pp[0],a)||dis(a,b)<dis(pp[0],b)) { printf("%lf\n",dis(a,b)); continue; } if(dis(pp[0],a)<dis(pp[1],a)) { sum+=dis(pp[0],a)+dis(pp[1],b); } else { sum+=dis(pp[1],a)+dis(pp[0],b); } sum3=dis(pp[0],pp[1]); //cout<<sum<<" "<<sum1<<" "<<sum2<<" "<<sum3<<endl; double minx=min(sum3*2+sum,min(sum1-sum3+sum,sum2-sum3+sum)); printf("%lf\n",minx); } return 0;}
1 0
- CF 75E 题解 Ship's Shortest Path
- CF 416E - President's Path(floyd + DP)
- Dijkstra's shortest path algorithm
- Dijkstra’s shortest path algorithm
- Red Knight's Shortest Path
- CF 82E 题解 Corridor
- CodeForces 59E Shortest Path 用边跑最短路
- Dijkstra's Algorithm of shortest path
- Dijkstra's Shortest-Path Algorithm Implementation(TODO)
- CF 87E 题解 Mogohu-Rea Idol
- CF 77E Martian Food题解
- CF 55E Very simple problem 题解
- [CF 335E]Counting Skyscrapers题解翻译
- [CF 329E]Evil题解翻译
- CF Round 418(div2) E题解
- CF 3A Shortest path of the king
- cf 3a Shortest path of the king
- SPOJ 15. The Shortest Path 最短路径题解
- 寒江独钓 第二章(3)Hook分发函数和回调函数
- ORACLE PROFILE(配置文件)查询
- 说说JSON和JSONP,也许你会豁然开朗(转)
- 事务漫谈(二)---spring角度
- 用开源中国(oschina)Git管理代码(整合IntelliJ 13.1.5)
- CF 75E 题解 Ship's Shortest Path
- PendingIntent
- three.js 源码注释(二十八)Cameras/Camera.js
- Single Number
- fusionchart使用说明
- 旋转动画
- 将scl分频
- Extjs GRID操作文档
- Eclipse上搭建SSH(struts-2.2.3 + spring-2.5.6 + hibernate-3.6.8)框架-附源码