Run Time: 0.000
Ranking (as of 2016-12-09): 78 out of 364
Language: C++
Applied dynamic programming.
areas[i] is the areas with the bitmap i of cranes' usage where each bit of i corresponds to the i-th crane.
/*
UVa 11515 - Cranes
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_11515_Cranes.cpp
*/
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int C_max = 15;
struct crane {
int x_, y_, r_;
} cranes[C_max];
bool overlapped[C_max][C_max];
// overlapped[i][j] is true
// if the covering areas of i-th crane and j-th crane are overlapped
int areas[1 << C_max];
// areas[i] is the areas with the bitmap i of cranes' usage
int main()
{
int t;
scanf("%d", &t);
while (t--) {
int C;
scanf("%d", &C);
for (int i = 0; i < C; i++)
scanf("%d %d %d", &cranes[i].x_, &cranes[i].y_, &cranes[i].r_);
memset(overlapped, 0, sizeof(overlapped));
for (int i = 0; i < C - 1; i++)
for (int j = i + 1; j < C; j++) {
int dx = cranes[i].x_ - cranes[j].x_, dy = cranes[i].y_ - cranes[j].y_,
dr = cranes[i].r_ + cranes[j].r_;
if (dx * dx + dy * dy <= dr * dr)
overlapped[i][j] = overlapped[j][i] = true;
}
memset(areas, 0, sizeof(int) * (1 << C));
areas[1] = cranes[0].r_ * cranes[0].r_;
#ifdef DEBUG
printf("[1]:%d\n", areas[1]);
#endif
for (int i = 1, ib = 1 << 1; i < C; i++, ib <<= 1) {
int a = cranes[i].r_ * cranes[i].r_;
for (int j = 1; j < ib; j++)
if (areas[j]) {
int k, kb;
for (k = 0, kb = 1; k < i; k++, kb <<= 1)
if (j & kb && overlapped[i][k])
break;
if (k == i) // not overlapped
areas[j | ib] = areas[j] + a;
}
areas[ib] = a;
#ifdef DEBUG
for (int j = 1; j < 1 << ib; j++)
if (areas[j])
printf("[%d]:%d ", j, areas[j]);
putchar('\n');
#endif
}
int max_area = 0;
for (int j = 1; j < 1 << C; j++)
max_area = max(max_area, areas[j]);
printf("%d\n", max_area);
}
return 0;
}
No comments:
Post a Comment