思路:
1.准备:计算r的最大值
2.搜索:枚举两点间距离,根据前面的油确定当前油的半径 //当两个油滴之间的距离小于那个油滴的半径,我们就要把它变成0
3.答案:原空间减去目前最大空间
代码:
#include <iostream> #include <cmath> using namespace std; const int MAXN = 110; const double pi = acos(-1); struct node { int x, y; }; int n, used[MAXN]; double r[MAXN], R[MAXN], ans; node s, e; node a[MAXN]; double dis(int x1, int y1, int x2, int y2) { return abs(sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))); } void dfs(int id) { if(id > n) { double sum = 0; for(int i=1; i<=n; i++) { sum += pi * r[i] * r[i]; } ans = max(ans, sum); return ; } for(int i=1; i<=n; i++) { if(!used[i]) { r[i] = R[i]; used[i] = 1; for(int j=1; j<=n; j++) { if(used[j] && i != j) { double dist = dis(a[j].x, a[j].y, a[i].x, a[i].y); r[i] = min(r[i], dist - r[j]); if(r[i] < 0) r[i] = 0; } } dfs(id + 1); used[i] = 0; } } } int main() { cin >> n; cin >> s.x >> s.y >> e.x >> e.y; for(int i=1; i<=n; i++) { cin >> a[i].x >> a[i].y; R[i] = min(min(abs(s.x - a[i].x), abs(e.x - a[i].x)), min(abs(s.y - a[i].y), abs(e.y - a[i].y))); } dfs(1); double S = (double)(abs(e.x - s.x)) * (double)(abs(e.y - s.y)); cout << (int)(S - ans + 0.5) << endl; return 0; }