Air Strike
Problem Description
General
Gee is the commander of a military base. He has just received alarming
news from one of his spies: the enemy's preparing an air missile strike.
The base contains two magnetic towers. When activated and given
sufficient power, each of the magnetic towers creates a powerful
horizontal magnetic disk. If any missile passes through this disk it
deflects away from the base.
Although those towers seem to be an
excellent air defense method, there is a problem: The area of the disk
generated by a tower is proportional to the amount of energy it
receives. The base has enough power plants to generate a certain amount
of energy, which has to be divided among those two towers. That means
that the total area of the two disks generated from the towers should
not exceed the total energy generated by the power plants. Fortunately,
the spy was able to know the exact target co-ordinates of the incoming
missiles and he reported them to General Gee. The General needs your
help in distributing the energy on the two magnetic towers to minimize
the number of missiles that will not get deflected by the magnetic
towers and therefore will hit the base. You may assume the following:
1.
The towers have different heights and therefore there are no problems
associated with the magnetic disks interfering with each other.
2.
A missile will deflect if it passes through the magnetic disk of a
tower or even if it just touches its boundary.
3. A missile
hitting a tower (landing exactly on its location) will deflect, even if
the tower is not given any energy.
4. All incoming missiles will
go down simultaneously at the exact instant; therefore, there will not
be any time available to redistribute the energy amongst the two towers
during the strike.
Input
Input consists of several test cases. Each
test case is specified on N+2 lines. The first line contains an integer
(1 <= N <= 1, 000) representing the number of missiles. The second
line contains 5 real numbers X1, Y1, X2,
Y2 and T: (X1, Y1) is the coordinates
of the first tower, (X2, Y2) is the coordinates of
the second tower and (0 <= T) is the total amount of energy
generated from the power plants (the total area of the two magnetic
disks). Each line of the remaining N lines contains two real numbers
representing the landing coordinates of a missile.
The absolute value
of all the given real numbers is less than or equal to 100 and may
include a decimal point followed by up to 3 digits. Any two consecutive
numbers on the same line are separated by one or more white-space
characters. Zero or more blank lines may appear between test cases.
The
last line of the input file is made of a single zero.
Output
For each test case, print the following
line:
k. M
Where k is the test case number (starting at one,) and M
is the minimum number of missiles that will NOT be deflected in the
best distribution of energy among the two towers. Use π = 3.141.
Note:
There is a blank space before M.
Sample Input
6
-3 0 3 0 40.833
-1 4
-2 2.5
1 2
5 2
-4 0
-3 -1
2
0 0 1 1 0
0 0
1 1
0
Sample Output
1. 2
2. 0
#include<stdio.h>
#include<stdlib.h>
#define maxn 1000
#define PI 3.141
const double inf = 0.00001;
double d1[maxn], d2[maxn];
double dis(double x1, double y1, double x2, double y2)
{
return 1.0 * (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}
int main()
{
int n, i, j, ans, sum, k = 0;
double r1, r2, r3, r4, r;
double x1, y1, x2, y2, x, y;
while (scanf("%d", &n), n)
{
scanf("%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &r);
r = 1.0 * r / PI;
for (i = 0; i < n; i++)
{
scanf("%lf%lf", &x, &y);
d1[i] = dis(x, y, x1, y1);
d2[i] = dis(x, y, x2, y2);
}
for (i = 0, ans = n; i < n; i++)
{
r1 = d1[i];
if (r1 <= r)//枚举一个点和其中一个塔的距离r1,则剩下的磁波距离为r2
{
r2 = r - r1;
for (j = 0, sum = 0; j < n; j++)
{
if (d1[j] <= r1)
{
sum++;
}
else if (d2[j] <= r2)
{
sum++;
}
}
if (ans > n - sum)
{
ans = n - sum;
}
}
r2 = d2[i];
if (r2 <= r)
{
r1 = r - r2;
for (j = 0, sum = 0; j < n; j++)
{
if (d1[j] <= r1)
{
sum++;
}
else if (d2[j] <= r2)
{
sum++;
}
}
if (ans > n - sum)
{
ans = n - sum;
}
}
}
k++;
printf("%d. %d\n", k, ans);
}
return 0;
}