头像
牛客655590920号
发布于 2022-04-18 16:33
+ 关注

解释

我来解释一下这个题意吧,怪不得总提交量这么少,这题题意真的不太清晰。
题中:当某个配送员排在最后的时候,他需要以当时自己的最高速度往前跑,直到超过排头的人 u 米,然后降回到原始速度 v 米/秒。每个人最初的最高速度为c[i] 米/秒,每轮衰减d[i] 米/秒,也就是说,如果i是第j个跑的,那么他的速度就是c[i]-(j-1)*d[i] 米/秒。这段话的意思没有叙述清楚,什么叫”i是第j个跑的“??我看到这个地方的时候一头雾水,不知道它想表达什么。而且这个地方”每轮“又是什么意思??
题目最后一句话中的”跑完一轮“按照它的解释是每个人都超过排头一次,如果按照这个解释去理解上文的”每轮“,那么就存在一个问题:题目要我们求期望,那么究竟要跑几轮呢?题目没说。而且只要随着轮数的增加,必定存在速度衰减到小于v的情况,而题目又明确说了保证不会存在速度小于v的情况,所以这样理解题意是缺少条件且前后矛盾的。
因此,”每轮“是这样理解的:每次当一个人超过排头的时候。所以上文所说的那段话是这个意思:当最后一个人超过排头时,这是一轮,而且每个人的最高速度会随之衰减一次。i是人的编号,j是初始状态下这个人从队伍最后一个开始计数的位置,即倒数第一个人是第1个以最高速度跑的,对应第一轮。第一轮结束后,倒数第二个人(此时成为队伍的倒数第一个)是第2个以最高速度跑的,对应第二轮。显然,倒数第n个人(是队伍原始状态下的第一个)对应第n轮,此时他的最高速度是c[0]-(n-1)*d[0]。

这样一来这道题就好理解了,只要每个人都以不同的最高速度跑,求出时间平均值,然后这n个人的时间平均值相加就可以了。这题之所以是3星我觉得有2星都是题意不清导致的,其实算法非常简单。题目最后一句话中的”跑完一轮“我觉得应该改成”跑完一场“,不然太容易误导人了,难道这题是英文翻译过来的??
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main{
    

    
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] strs = br.readLine().split(" ");
        int n = Integer.parseInt(strs[0]);
        double v = Double.parseDouble(strs[1]);
        double u = Double.parseDouble(strs[2]);
        double[] c = new double[n], d = new double[n];
        String[] cs = br.readLine().split(" ");
        String[] ds = br.readLine().split(" ");
        for(int i = 0; i < n; ++i){
            c[i] = Double.parseDouble(cs[i]);
            d[i] = Double.parseDouble(ds[i]);
        }
        
        double sum = 0, temp;
        for(int i = 0; i < n; ++i){
            temp = 0;
            for(int j = 0; j < n; ++j){
                temp += u / (c[i] - v - j * d[i]);
            }
            sum += temp;
        }
        System.out.printf("%.3f", sum);
        
    }
}


全部评论

(0) 回帖
加载中...
话题 回帖

本文相关内容

等你来战

查看全部

热门推荐