1. 程式人生 > >Codeforces 1078 - A/B/C/D/E - (Undone)

Codeforces 1078 - A/B/C/D/E - (Undone)

連結:https://codeforces.com/contest/1078


A - Barcelonian Distance - [分類討論]

題意:

給出一個在二維平面直角座標系第一象限內的,單位長度為 $1$ 的無限大網格,每條直線都代表道路。又給你一條直線 $ax+by+c=0$,也代表一條道路。

現在給你兩個格點座標 $(x_1,y_1)$ 和 $(x_2,y_2)$,讓你求該兩點間最短的道路距離。

題解:

一個矩形,它的四條邊無限延長,跟另外一條直線,會產生兩個(直線水平或豎直)或者四個交點(直線傾斜),計算出這個些點,然後算出所有可能的走法的長度即可。

AC程式碼:

#include<bits/stdc++.h>
using namespace std;
typedef pair<double,double> pff;
const double eps=1e-10;
double a,b,c;
pff p1,p2;
pff q1,q2,q3,q4;
double ans,ans1,ans2,ans3,ans4;
inline double dist(const pff& a,const pff& b) {
    return sqrt(pow(a.first-b.first,2)+pow(a.second-b.second,2
)); } inline double min(double a,double b,double c,double d,double e) { double res=a; res=min(res,b); res=min(res,c); res=min(res,d); res=min(res,e); return res; } int main() { ans=ans1=ans2=ans3=ans4=1e12; cin>>a>>b>>c>>p1.first>>p1.second>>p2.first>>p2.second; ans
=fabs(p1.first-p2.first)+fabs(p1.second-p2.second); if(fabs(a)<eps) { q1=make_pair(p1.first,-c/b); q2=make_pair(p2.first,-c/b); ans1=dist(p1,q1)+dist(q1,q2)+dist(q2,p2); } else if(fabs(b)<eps) { q1=make_pair(-c/a,p1.second); q2=make_pair(-c/a,p2.second); ans2=fabs(p1.first-q1.first)+dist(q1,q2)+fabs(p2.first-q2.first); } else { q1=make_pair(p1.first,-(a*p1.first+c)/b); q3=make_pair(-(b*p1.second+c)/a,p1.second); q2=make_pair(p2.first,-(a*p2.first+c)/b); q4=make_pair(-(b*p2.second+c)/a,p2.second); ans1=dist(p1,q1)+dist(q1,q2)+dist(q2,p2); ans2=dist(p1,q1)+dist(q1,q4)+dist(q4,p2); ans3=dist(p1,q3)+dist(q3,q2)+dist(q2,p2); ans4=dist(p1,q3)+dist(q3,q4)+dist(q4,p2); } printf("%.10f\n",min(ans,ans1,ans2,ans3,ans4)); }

 


B - The Unbearable Lightness of Weights - []

題意: