寒假3

宙天

https://ac.nowcoder.com/acm/contest/120563/A

F题

解题思路

手动模拟前几次博弈,不难发现每前进 5 格必然导致 1 次换行。不考虑换行,长度为 n 的网格也得走 n−1 步才能到终点。因此最小总步数为 n−1 + n/5。

示列代码:

void solve(){
    int n;
    cin >> n;
    cout << n-1 + n/5 << endl;
}

H题

解题思路

三角形面积可以用向量叉积的绝对值的一半来计算。对于点A(xa, ya), B(xb, yb), O(x, 0),向量OA = (xa - x, ya - 0) = (xa - x, ya),向量OB = (xb - x, yb - 0) = (xb - x, yb)。三角形面积 = |(xa - x)yb - (xb - x)ya| / 2 = |xayb - xyb - xbya + xya| / 2 = |xayb - xbya + x*(ya - yb)| / 2。

设常数C = xayb - xbya,k = ya - yb,则面积 = |C + kx| / 2。要求面积等于2,即|C + kx| = 4。

分类讨论:

如果k = 0,即ya = yb,则|C| = 4。此时C是定值,若|C| = 4,则任意x都满足条件,我们可以输出0;否则无解。

如果k ≠ 0,则方程C + kx = 4 或 C + kx = -4,解得x = (4 - C)/k 或 x = (-4 - C)/k。任选一个输出即可。

注意:题目要求面积与2的绝对误差不超过0.001,使用double计算并保留足够精度即可。(开15位即可)

示列代码:

void solve(){
    int xa,ya,xb,yb;
    cin>>xa>>ya>>xb>>yb;
    ll C=(ll)xa*yb-(ll)xb*ya;
    ll k=ya-yb;
    if (k==0){
        if (C==4||C==-4) {
            printf("0\n");
        } else {
            printf("no answer\n");
        }
        return;
    }
    double x1=(4.0-C)/k;
    printf("%.15lf\n",x1);
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务