• 蓝桥杯2024年第十五届省赛真题-小球反弹


    在这里插入图片描述
    以下两个解法感觉都靠谱,并且网上的题解每个人答案都不一样,目前无法判断哪个是正确答案。

    方法一:模拟
    代码参考博客

    #include 
    #include 
    #include 
     
    using namespace std;
     
    int main() {
        const int maxX = 343720;
        const int maxY = 233333;
        const int vx = 15;
        const int vy = 17;
     
        int x = 0, y = 0;
        int time = 0;
        double totalDistance = 0;
        bool xPositive = true, yPositive = true;
     
        while (true) {
        	//根据方向判断是+距离还是-距离
            x += xPositive ? vx : -vx;
            y += yPositive ? vy : -vy;
            time++;
            //移动的距离
            double segmentLength = sqrt(vx * vx+ vy * vy);
            // 检查是否碰到边界并反弹
            if (x > maxX || x < 0) {
                xPositive = !xPositive; // 反转X方向
                x = (x > maxX) ? maxX : 0; // 将坐标调整到边界上
            }
            if (y > maxY || y < 0) {
                yPositive = !yPositive; // 反转Y方向
                y = (y > maxY) ? maxY : 0; // 将坐标调整到边界上
            }
     
            // 累加路径长度
            totalDistance += segmentLength;
     
            // 假设当粒子回到原点时停止模拟
            if (x == 0 && y == 0) {
                break;
            }
        }
     
        // 输出总路径长度
        cout << "总路径为:" << totalDistance << endl;
     
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    答案:14261800000

    方法二:数学物理题
    把速度分解成x方向和y方向,已知x方向来回一趟的时间是2343720/15,y方向来回一趟的时间是2233333/17,已知小球要回到原点,即x和y方向要同时回到原点,时间就是2343720/15和2233333/17的整数倍,即最小公倍数。就能把时间t求出来,然后乘以速度sqrt(15^2+17^2)就是总路程。

    #include 
    using namespace std;
    int main() {
        int a = 2*343720/15;
        int b = 2*233333/17;
        int i = 1;
        while(i*a%b!=0){
            i++;
        }
        double t = i*a;
        double s = t*sqrt(pow(15, 2)+pow(17, 2));
        cout<<fixed<<setprecision(2)<<s<<endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出:28520969829.65

    复习:最大公因数GCA(Greatest Common Divisor)和最小公倍数LCM(Least Common Multiple)

    int my_gcd(int a,int b){
        if(a%b==0)return b;
        else return my_gcd(b, a%b);
    }
    
    int my_lcm(int a,int b){
        int i=1;
        while(i*a%b!=0)i++;
        return i*a;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    修改Docker镜像默认下载地址
    如何开发一款基于 Vite+Vue3 的在线表格系统(上)
    JavaEE 进阶:Spring 核⼼与设计思想
    【ElfBoard】基于 Linux 的智能家居小项目
    Apple官网的动效
    Thymeleaf学习(2)—— 流程控制
    Distributed Systems MIT - Introduction总结
    强缓存和弱缓存
    python re findall search finditer complie 预加载
    Comparator::compare设定排序的升序 降序
  • 原文地址:https://blog.csdn.net/qq_61735602/article/details/137997607