http://acm.hust.edu.cn/vjudge/contest/view.action?cid=43116#overview
H 水题不述。
#include <iostream> using namespace std; bool visit[10005]; int main() { int n; while (cin>>n) { memset(visit, 0, sizeof(visit)); int num = -1, a; for (int i = 0; i <= n; i++) { cin>>a; if (visit[a]) { num = a; } else visit[a] = true; } cout << num << endl; } }
D 久违了计算几何!!
就是一个凸包与圆的面积交的问题。
重点是建立抛物线的方程
剩下的套模板就ok。
#include <iostream> #include <math.h> #include <iomanip> using namespace std; struct Point { double x, y; } p[105]; #define pi acos(-1.0) #define eps 1e-10 double x_mult(Point sp, Point ep, Point op) { return (sp.x - op.x) * (ep.y - op.y) - (sp.y - op.y) * (ep.x - op.x); } double cross(Point a, Point b, Point c) { return (a.x - c.x) * (b.x - c.x) + (a.y - c.y) * (b.y - c.y); } double dist(Point a, Point b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); } double cal_area(Point a, Point b, Point c, double r) { double A, B, C, x, y, tS; A = dist(b, c); B = dist(a, c); C = dist(b, a); if (A < r && B < r) return x_mult(a, b, c) / 2; else if (A < r && B >= r) { x = (cross(a, c, b) + sqrt(r * r * C * C - x_mult(a, c, b) * x_mult(a, c, b))) / C; tS = x_mult(a, b, c) / 2; return asin(tS * (1 - x / C) * 2 / r / B * (1 - eps)) * r * r / 2 + tS * x / C; } else if (A >= r && B < r) { y = (cross(b, c, a) + sqrt(r * r * C * C - x_mult(b, c, a) * x_mult(b, c, a))) / C; tS = x_mult(a, b, c) / 2; return asin(tS * (1 - y / C) * 2 / r / A * (1 - eps)) * r * r / 2 + tS * y / C; } else if (fabs(x_mult(a, b, c)) >= r * C || cross(b, c, a) <= 0 || cross(a, c, b) <= 0) { if (cross(a, b, c) < 0) if (x_mult(a, b, c) < 0) return (-acos(-1.0) - asin(x_mult(a, b, c) / A / B * (1 - eps))) * r * r / 2; else return (acos(-1.0) - asin(x_mult(a, b, c) / A / B * (1 - eps))) * r * r / 2; else return asin(x_mult(a, b, c) / A / B * (1 - eps)) * r * r / 2; } else { x = (cross(a, c, b) + sqrt(r * r * C * C - x_mult(a, c, b) * x_mult(a, c, b))) / C; y = (cross(b, c, a) + sqrt(r * r * C * C - x_mult(b, c, a) * x_mult(b, c, a))) / C; tS = x_mult(a, b, c) / 2; return (asin(tS * (1 - x / C) * 2 / r / B * (1 - eps)) + asin(tS * (1 - y / C) * 2 / r / A * (1 - eps))) * r * r / 2 + tS * ((y + x) / C - 1); } } int main() { double x, y, v, theta, t, g, R; while (cin >> x >> y >> v >> theta >> t >> g >> R) { if (x + y + v + theta + t + g + R < eps) break; int n; cin >> n; for (int i = 0; i < n; i++) { cin >> p[i].x >> p[i].y; } Point cir; cir.x = x + v * cos(theta / 180.0 * pi) * t; cir.y = y + v * sin(theta / 180.0 * pi) * t - 0.5 * g * t * t; double area = 0.0; for (int i = 0; i < n; i++) { area += cal_area(p[i], p[(i + 1) % n], cir, R); } cout << fixed << setprecision(2) << area << endl; } }