又要玄关求调,必关
查看原帖
又要玄关求调,必关
625671
Zmk2009楼主2025/7/27 21:44
#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int N = 65;
int q , l1 , r1 , l2 , r2;
int b[N];
double eps = 1e-9;
bool big(double a, double b){return a - b > eps;}
double dis(int x1 , int y1 ,int x2 ,int y2){return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));}
double chmin(double a , double b){return big(a , b) ? b : a;}
double chmax(double a , double b){return big(a , b) ? a : b;}
struct Point{
	int x , y;
	Point(){}
	Point(int x,int y):x(x),y(y){}
	void read(){cin >> x >> y;}
	bool operator < (const Point & A) const{
		if (x != A.x) return x < A.x;
		else return y < A.y;
	}
}a[N];
double r[N];
double spread(int t){
	double ans = 1000000.00;
	for (int i = 1 ; i < t ; i ++){
		if (big(r[i], dis(a[b[t]].x , a[b[t]].y , a[b[i]].x , a[b[i]].y))) return 0.00;
		ans = chmin(ans , dis(a[b[t]].x , a[b[t]].y , a[b[i]].x , a[b[i]].y) - r[i]);
	}
	ans = chmin(ans , 1.0 * (a[b[t]].x - min(l1,l2)));
	ans = chmin(ans , 1.0 * (max(l1,l2) - a[b[t]].x));
	ans = chmin(ans , 1.0 * (a[b[t]].y - min(r1,r2)));
	ans = chmin(ans , 1.0 * (max(r1,r2) - a[b[t]].y)); 
	return ans;
}
signed main(){
	cin >> q;
	cin >> l1 >> r1 >> l2 >> r2;
	for (int i = 1 ; i <= q ; i ++) a[i].read(),b[i] = i;
	double res = 1000000.00;
	do{
		for (int i = 1 ; i <= q ; i ++) r[i] = spread(i);
		double ans = 0.00;
		for (int i = 1 ; i <= q ;i ++) ans += 3.1415926 * r[i] * r[i];
		res = chmin(res , round(ans));
	}while (next_permutation(b + 1 , b + q + 1));
	cout << (int) (max(l1 , l2) - min(l1 , l2)) * (max(r1 , r2) - min(r1, r2)) - res << endl;
	return 0;
}

30 pts
Wa on #2

  • 2.in
3 
-98 5 30 30 
-42 11 
-51 17 
-11 22 

2.ans

2547
2025/7/27 21:44
加载中...