校内赛线上赛记录

发布于 11 天前  52 次阅读


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");
    }
}

「雪霁融雾月,冰消凝夜雨」