A题,是我在打完C之后在回宿舍的路上听队友讲的,他们想了一个小时都没有什么头绪,简单来说就是里程计会在包含3和8的地方跳过,我问队友10的答案是多少,答曰:8,100的答案是多少,答曰64。其实说到这里就已经很明显了,一个是$2^3$一个是$2^6$,直觉告诉我就是每一个位数都乘$2^3$,简单验证了一下样例就敲出来了),赛后题解说是八进制转化,好像十分有道理(
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
如果赛后查重看到了这篇,在这里声明一下,不存在抄袭情况