上海理工大学第二届“联想杯”全国程序设计邀请赛 - Experiment Class(几何+三分套三分)
生活随笔
收集整理的這篇文章主要介紹了
上海理工大学第二届“联想杯”全国程序设计邀请赛 - Experiment Class(几何+三分套三分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:在二維平面的第一象限中給出兩條射線代表河流,再給出起點和終點,問從起點出發,至少經過兩條河各一次后到達終點的最短路
題目分析:如果只有一條河的話就是初中數學的經典問題了,現在加上了兩條河無非就是多了分類討論,但是分類討論寫的那份代碼過了 96% 多,還是算了吧
考慮三分套三分,當在某條河上確定了一個交點后,可以通過三分去尋找另一條河交點的最短路,所以是可行的
需要注意的是,因為整個矩陣的大小最大是 100?100100*100100?100 的,在此之中河流的最大長度實際上是對角線的長度,也就是 2?100\sqrt{2}*1002??100 的,所以三分的上界定到 200200200 倍的方向向量就可以啦
代碼:
// Problem: Experiment Class // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/17574/E // Memory Limit: 524288 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2) // #pragma GCC optimize("Ofast","inline","-ffast-math") // #pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #define lowbit(x) x&-x using namespace std; typedef long long LL; typedef unsigned long long ull; template<typename T> inline void read(T &x) {T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f; } template<typename T> inline void write(T x) {if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0'); } const int inf=0x3f3f3f3f; const int N=1e6+100; // `計算幾何模板` const double eps = 1e-8; //`Compares a double to zero` int sgn(double x){if(fabs(x) < eps)return 0;if(x < 0)return -1;else return 1; } struct Point{double x,y;Point(){}Point(double _x,double _y){x = _x;y = _y;}void input(){scanf("%lf%lf",&x,&y);}bool operator == (Point b)const{return sgn(x-b.x) == 0 && sgn(y-b.y) == 0;}bool operator < (Point b)const{return sgn(x-b.x)== 0?sgn(y-b.y)<0:x<b.x;}Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}//返回兩點的距離double distance(Point p){return hypot(x-p.x,y-p.y);}Point operator +(const Point &b)const{return Point(x+b.x,y+b.y);}Point operator *(const double &k)const{return Point(x*k,y*k);}Point operator /(const double &k)const{return Point(x/k,y/k);} }t1,t2,st,ed; double cal(Point x,Point y) {return st.distance(x)+x.distance(y)+y.distance(ed); } double solve2(Point x) {Point l=Point(0,0),r=t2;while(l<r) {Point mid=l+(r-l)/3;Point mmid=r-(r-l)/3;if(cal(x,mid)<cal(x,mmid)) {r=mmid;} else {l=mid;}}return cal(x,l); } double solve1() {Point l=Point(0,0),r=t1;while(l<r) {Point mid=l+(r-l)/3;Point mmid=r-(r-l)/3;if(solve2(mid)<solve2(mmid)) {r=mmid;} else {l=mid;}}return solve2(l); } int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);t1.input(),t2.input(),st.input(),ed.input();t1=t1*200,t2=t2*200;double ans=solve1();swap(st,ed);ans=min(ans,solve1());printf("%.3f\n",ans);return 0; }總結
以上是生活随笔為你收集整理的上海理工大学第二届“联想杯”全国程序设计邀请赛 - Experiment Class(几何+三分套三分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海理工大学第二届“联想杯”全国程序设计
- 下一篇: 上海理工大学第二届“联想杯”全国程序设计