美文网首页
Lutece Problem 95-Ants Run

Lutece Problem 95-Ants Run

作者: 小菜变大菜 | 来源:发表于2019-12-23 15:04 被阅读0次

    题目

    https://acm.uestc.edu.cn/problem/ants-run/description
    输入n和r分别代表蚂蚁只数和圆周半径,再输入n只蚂蚁的爬行速度。题目描述将n只蚂蚁按输入顺序以时钟顺序放在半径为r的的圆周上,当任一蚂蚁追上它前面的蚂蚁,游戏结束,要求找出最长的游戏时间(摆放位置不同,游戏时间也不同)。

    分析

    只要有一只蚂蚁追上其前面的蚂蚁游戏就结束,贪心策略告诉我们(,所有那些能追上前一只蚂蚁的蚂蚁(因为速度比前一只慢就追不上),同时追上时,游戏时间是最长的。于是转化为将两只相邻蚂蚁的速度差放置在圆周上的问题,下图举了两个半径均为1的例子。最终游戏时间就是1/k*圆周长,圆被等分成k份。

    用速度差平分圆周

    注意不要忘记第n-1和第0只蚂蚁也在发生追击。

    程序

    #include <iostream>
    #include <algorithm>
    #include <iomanip>
    
    using namespace std;
    #define pi 3.141592653589793
    
    int main()
    {
        int cs;cin>>cs;
        int n, r;
        float spd[25], sub_spd[25];
        for(int T=0;T<cs;T++){
            cin >> n>> r;
            float l = 2*pi*r;
            cin >> spd[0];
            int spd_sum=0;
            for(int i=1;i<n;i++) {
                cin>>spd[i];
                spd[i]<spd[i-1]? sub_spd[i-1]=spd[i-1]-spd[i]:sub_spd[i-1]=0;
            }
            spd[n-1]>spd[0]?sub_spd[n-1]=spd[n-1]-spd[0]:sub_spd[n-1]=0;
            for(int i=0;i<n;i++)    spd_sum+=sub_spd[i];
            if(spd_sum==0) cout<<"Inf";
            else cout << setprecision(3)<<std::fixed<<l/spd_sum;
            if(T<cs-1) cout << "\n";
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:Lutece Problem 95-Ants Run

          本文链接:https://www.haomeiwen.com/subject/pgjznctx.html