求助
查看原帖
求助
279743
1n1c5c5z楼主2024/1/12 10:04

为什么以下的两份代码一份 WA on #34,另一份 AC? WA:
输入:

10000000 0 10000001
-10000000 0 10000000

答案:

4216.37028734199702739716

输出:

4216.38026992976665496826
#include <bits/stdc++.h>

using namespace std;

const long double pi = 3.14159265358979323846264338;

inline long double Dist(pair <long double, long double> c1, pair <long double, long double> c2)
{
	return sqrtl((c1.first - c2.first) * (c1.first - c2.first) + (c1.second - c2.second) * (c1.second - c2.second));
}

pair <long double, long double> c1, c2;
long double r1, r2;
int main()
{
	ios :: sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> c1.first >> c1.second >> r1 >> c2.first >> c2.second >> r2;
	cout << fixed << setprecision(20);
	if (r1 < r2) swap(c1, c2), swap(r1, r2);
	long double dis = Dist(c1, c2);
	if (dis >= r1 + r2) cout << 0.0 << endl;
	else if (dis <= fabs(r2 - r1)) cout << pi * min(r1, r2) * min(r1, r2) << endl; 	
	else
	{
		long double a1 = acosl((r1 * r1 + dis * dis - r2 * r2) / 2.0 / dis / r1);
		long double a2 = acosl((r2 * r2 + dis * dis - r1 * r1) / 2.0 / dis / r2);
		long double ss1 = r1 * r1 * a1;
		long double ss2 = r2 * r2 * a2;
		long double ch = r1 * sinl(a1);
		cout << ss1 + ss2 - dis * ch << endl;
	}
	return 0;
}

AC:

#include <bits/stdc++.h>

using namespace std;

const long double pi = 3.14159265358979323846;

inline long double Dist(pair <long double, long double> c1, pair <long double, long double> c2)
{
	return sqrtl((c1.first - c2.first) * (c1.first - c2.first) + (c1.second - c2.second) * (c1.second - c2.second));
}

pair <long double, long double> c1, c2;
long double r1, r2;
int main()
{
	ios :: sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> c1.first >> c1.second >> r1 >> c2.first >> c2.second >> r2;
	cout << fixed << setprecision(20);
	if (r1 < r2) swap(c1, c2), swap(r1, r2);
	long double dis = Dist(c1, c2);
	if (dis >= r1 + r2) cout << 0.0 << endl;
	else if (dis <= fabs(r2 - r1)) cout << pi * min(r1, r2) * min(r1, r2) << endl; 	
	else
	{
		long double a1 = acosl((r1 * r1 + dis * dis - r2 * r2) / 2 / dis / r1);
		long double a2 = acosl((r2 * r2 + dis * dis - r1 * r1) / 2 / dis / r2);
		long double ss1 = r1 * r1 * a1;
		long double ss2 = r2 * r2 * a2;
		cout << ss1 + ss2 - r1 * r1 / 2 * sin(2 * a1) - r2 * r2 / 2 * sin(2 * a2) << endl;
	}
	return 0;
}
2024/1/12 10:04
加载中...