[TIOJ] 1559. Mikey的數學作業

題目連結:http://tioj.infor.org/problems/1559
數學不好,想了一下下。我的作法是求出給定兩個點的距離跟夾角,之後以其中一個點為暫時原點,然後用極座標轉回普通座標方式的作法找到60度的點,再平移回剛剛的暫時原點即可。
#include <bits/stdc++.h>
using namespace std;
typedef pair<double,double> PDD;
#define X first
#define Y second
#define deg2rad(x) (acos(-1)*x/180.)

int main(){
	PDD a,b, ans1, ans2;
	while(cin>>a.X>>a.Y>>b.X>>b.Y){
		double dis = sqrt((a.X-b.X)*(a.X-b.X)+(a.Y-b.Y)*(a.Y-b.Y));
		double theta = atan2((b.Y-a.Y), (b.X-a.X));
		ans1 = {a.X+dis*cos(deg2rad(60)+theta), a.Y+dis*sin(deg2rad(60)+theta)};
		ans2 = {a.X+dis*cos(deg2rad(300)+theta), a.Y+dis*sin(deg2rad(300)+theta)};
		if(ans2<ans1) swap(ans1,ans2);
		cout<<setprecision(3)<<fixed<<ans1.X<<' '<<ans1.Y<<' '<<ans2.X<<' '<<ans2.Y<<'\n';
	}
	return 0;
}

留言

這個網誌中的熱門文章

[TIOJ] 1271. [IOI 2012] Scrivener 斯克里夫尼

[TIOJ] 1429. [APIO '12] 忍者調度問題

[Codeforces] 731D. 80-th Level Archeology