A题,是我在打完C之后在回宿舍的路上听队友讲的,他们想了一个小时都没有什么头绪,简单来说就是里程计会在包含3和8的地方跳过,我问队友10的答案是多少,答曰:8,100的答案是多少,答曰64。其实说到这里就已经很明显了,一个是
C题判断圆和矩形是否相交,这看上去就很水,无奈码力下降严重,敲了半天还wa了几发,总之就是题目没看清,圆的方程也能写错,出了种种问题还好最后对了)
思路是,对于矩形的四条边所在的直线,和圆方程联立,解出可能的交点,再判断是否在矩形的边上,然后特判圆在矩形中和矩形在圆中两种情况即可。
#include <stdio.h> #include <cmath> #include <iostream> using namespace std; int rx, ry, r; double ans1, ans2; int find(int x) { double g = r * r - (x - rx) * (x - rx); double a = 1, b = -2*ry, c = ry * ry - g; if (b * b - 4 * a * c < 0) return 0; else { ans1 = (-b + sqrt((b * b - 4 * a * c < 0))) / (2 * a); ans2 = (-b - sqrt((b * b - 4 * a * c < 0))) / (2 * a); } return 1; } int find2(int y) { double g = r * r - (y - ry) * (y - ry); double a = 1, b = -2 * rx, c = rx * rx - g; if (b * b - 4 * a * c < 0) return 0; else { ans1 = (-b + sqrt((b * b - 4 * a * c < 0))) / (2 * a); ans2 = (-b - sqrt((b * b - 4 * a * c < 0))) / (2 * a); } return 1; } double dis(int x, int y) { return sqrt((x - rx) * (x - rx) + (y - ry) * (y - ry)); } int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { bool f = 0; int x, y, w, h; cin >> x >> y >> w >> h; cin >> rx >> ry >> r; if ((rx >= x && rx <= x + w && ry >= y && ry <= y + h) || dis(x, y) <= r || dis(x + w, y) <= r || dis(x, y + h) <= r || dis(x + w, y + h) <= r) f = 1; if (find(x)) { if ((ans1 <= y + h && ans1 >= y) || (ans2 <= y + h && ans2 >= y)) f = 1; } if (find(x + w)) { if ((ans1 <= y + h && ans1 >= y) || (ans2 <= y + h && ans2 >= y)) f = 1; } if (find2(y)) { if ((ans1 <= x + w && ans1 >= x) || (ans2 <= x + w && ans2 >= x)) f = 1; } if (find2(y + h)) { if ((ans1 <= x + w && ans1 >= x) || (ans2 <= x + w && ans2 >= x)) f = 1; } if (f == 1) printf("Yes\n"); else printf("No\n"); } }
Comments 1 条评论
博主 lzusa
如果赛后查重看到了这篇,在这里声明一下,不存在抄袭情况