UESTC 95 Ants Run! 水题

117 篇文章 2 订阅
53 篇文章 0 订阅

Ants Run!

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

Professor Yang likes to play with ants when he is free. What? Are you asking why he plays with ants instead of others? Ah, because ant is the 

only non-plant living thing which can be found in Qingshuihe Campus of UESTC apart from human beings.

This time, Professor Yang caught several ants after finishing his lecture for freshmen. At the beginning of the game, he puts  N N ants around a 

plate and numbers them in clockwise order. The ants are so obedient that they run clockwise under the guide of Professor Yang on the boundary

 of the plate which is a circle. When one ant catches up with its previous ant, the game is over. Knowing the speed of ants, Professor Yang wants

 you to help him to adjust the distance between adjacent ants to make the game last longer.

Input

The first line of the input is  T  (no more than  10000 ), which stands for the number of test cases you need to solve.

Each test case begins with N R representing the number of ants participating the game is  N  and the radius of the circle is  R  cm. The next 

line lists  N integers and the  ith  number is the speed (cm/s) of the 
i
-th ant in clockwise direction. All numbers are positive integer not larger 

than  20 .

Output

If the game can last forever, print Inf in a single line, otherwise please output the longest time in seconds each game can last, which should be 

printed accurately rounded to three decimals.

Sample input and output

Sample Input Sample Output
2
3 1
1 1 1
3 1
3 2 1
Inf
3.142

Source

The 8th UESTC Programming Contest Preliminary
The question is from   here.

My Solution

本来觉得,可以把蚂蚁安排成逆序,比如 1追2,2追3,3追1;1追不上2,2追不上3,只有3可以追上1;所以2*π*R/(maxspeed - minspeed);
但是事实上蚂蚁是有顺序的,不能换顺序,所以只能统计出速度差,按比例安排距离,所过y <= x 则把xy放一起,然后用总总距离除以速度差的和。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
    int T, N, R, x, y, first, sum;
    scanf("%d", &T);
    while(T--){
        sum = 0; y = 0;
        scanf("%d%d", &N, &R);
        for(int i = 1; i <= N; i++){
            scanf("%d", &x);
            if(i == 1) first = x;
            if(x < y) sum += (y-x);
            y = x;
        }
        if(first < y) sum += (y-first);
        if(sum != 0) printf("%.3f\n", 2*acos(-1)*R/sum);
        else printf("Inf\n");
    }
    return 0;
}

谢谢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值