// UVa 10136 - Chocolate Chip Cookies
#include <iostream>
#include <string>
#include <sstream>
#include <cmath>
using namespace std;
struct point {
double x, y;
};
point p[200];
//const double size = 5;
const double lim = 2.5 * 2.5;
const double epsilon = 1e-6;
double dist2(point a, point b) {
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
point point_in_dir(point p, point q, double r) {
double dx = q.x - p.x;
double dy = q.y - p.y;
double rat = r / sqrt(dist2(p, q));
point m = { p.x + rat * dx, p.y + rat * dy };
return m;
}
bool circle2PtsRad(point p1, point p2, double r, point *c) {
double d2 = dist2(p1, p2);
double det = r * r / d2 - 0.25;
if (det < 0.0)
return false;
double h = sqrt(det);
c->x = (p1.x + p2.x) * 0.5 + (p1.y - p2.y) * h;
c->y = (p1.y + p2.y) * 0.5 + (p2.x - p1.x) * h;
return true;
}
int main() {
int t;
cin >> t;
string line;
getline(cin, line);
getline(cin, line);
for (; t; t--) {
int n = 0;
while (getline(cin, line) && line.length() > 0) {
istringstream strm(line);
strm >> p[n].x >> p[n].y;
n++;
}
int sol = n ? 1 : 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
if (i != j) {
point c1, c2;
if (circle2PtsRad(p[i], p[j], 2.5, &c1)) {
circle2PtsRad(p[j], p[i], 2.5, &c2);
int one = 0, two = 0;
for (int k = 0; k < n; k++) {
if (dist2(c1, p[k]) <= lim + epsilon)
one++;
if (dist2(c2, p[k]) <= lim + epsilon)
two++;
}
if (one > sol)
sol = one;
if (two > sol)
sol = two;
}
int ths = 0;
point center = point_in_dir(p[i], p[j], 2.5);
for (int k = 0; k < n; k++)
if (dist2(center, p[k]) <= lim + epsilon)
ths++;
if (ths > sol)
sol = ths;
}
}
cout << sol << endl;
if (t > 1)
cout << endl;
}
return 0;
}
Monday, May 4, 2015
UVa 10136 - Chocolate Chip Cookies
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment