1 条题解

  • 0
    @ 2025-8-24 22:59:12

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Cypher_404
    答应你们,1k 粉女装

    搬运于2025-08-24 22:59:12,当前版本为作者最后更新于2024-06-02 15:34:47,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P10562 [ICPC2024 Xi'an I] Triangle 题解

    终于,第 5 篇了。

    分析题意

    题目给出 AA 的坐标:(a,0)(a,0),和 BB 的坐标:(0,b)(0,b),再加上已知的原点 OO(0,0)(0,0)

    这三个点构成了一个直角三角形,需要你求出有多少个正方形在其中。(不足一个的如果占到了面积的 50%50\% 及以上算,否则不算)。

    分析做法

    看到 1a,b1061 \le a,b \le 10^6 并不大,可以考虑暴力模拟。

    具体模拟思路:

    算出直线 ABAB 的解析式,算出每一个的 xx 坐标所对应的 yy,然后使用梯形面积公式(上底加下底的和除以 2)。

    看到面积 50%\ge 50\% 考虑四舍五入。

    四舍五入:给浮点数类型的数字加上 0.50.5 再强制转化成整形即可。可自行模拟检验。

    坑点:

    1. 卡精度:可以用 double 类型再乘上一个浮点数,如:1.00001.0000

    2. 读题不仔细或思考不全:答案可能会爆 int,106×1062\frac {10^6 \times 10^6} {2} 达到了惊人的 5×10115\times 10^{11} 必须使用 long long。

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    double k,n,m;//浮点数类型
    long long ans;//答案:可能会炸 int
    double opt=1.00000;//乘数,减小精度误差
    int main()
    {
        cin>>n>>m;
        k=n*opt/-m;//计算 k
        for(int i=0;i<(int)m;i++)//从 1~m,虽然不加 (int) 也可以
        {
            double t=n+(2*i+1)*k/2;//简化以后的梯形公式
            t+=0.5;//四舍五入
            ans+=(long long)t;//强制转换成 long long 类型。实测:转换成 int 也可以。
        }
        cout<<ans;//输出
        return 0;
    }
    

    其实还是比较简单的一道题,希望大家多多点赞。

    • 1

    信息

    ID
    10314
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者