acwing 913. 排队打水和最短时间处理联系

简介: acwing 913. 排队打水和最短时间处理联系

acwing 913. 排队打水

n 个人排队到 1 个水龙头处打水,第 i 个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?

输入格式

第一行包含整数n

第二行包含 n 个整数,其中第i个整数表示第i 个人装满水桶所花费的时间 ti

输出格式

输出一个整数,表示最小的等待时间之和。

数据范围
image.png

image.png

输入样例:

7
3 6 1 4 2 5 7

输出样例:

56

思考过程/解题步骤:

这题考察的是一个贪心的思想,需要我们如何选取来达到最优的等待时间即最短的等待时间

image.png

下面给出这种贪心猜测的证明:

反证法:

image.png

这种思想可以额外引申到操作系统的进程调度算法:最短作业优先处理。这样子我们就可以很清楚的知道假设我们只想要得到最短等待时间之和这一项指标的话,那么我们就可以参照这里的思想去理解。同时,平时考试的时候为什么大部分人需要采取的策略是先易后难,跟这里的思想也许也有一定的关系,更少的空白等待思考时间。还有这里给了我一个启发,生活中如果遇到多件不能并发处理并且都不是很紧急但是又都很有必要做的事情,我以后就要根据时间长短优先处理能够先处理的,这样可以减少空白等待的时间。

import java.util.*;
import java.io.*;
public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(String.valueOf(reader.readLine()));
        int[] arr = new int[n];
        String[] num = reader.readLine().split(" ");
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(num[i]);
        }
        // 先排序
        Arrays.sort(arr);
        long res = 0;
        for (int i = 0; i < n; i++) {
            // 第i名打水的后面会有n-i-1个等待的,因此等待的时间就是arr[i] * (n-i-1)
            res += (arr[i] * (n-i-1));
        }
        writer.write(res + "\n");
        writer.flush();
        writer.close();
        reader.close();
    }
}


相关文章
|
7月前
|
JavaScript 测试技术
【动态规划】【精度】1883. 准时抵达会议现场的最小跳过休息次数
【动态规划】【精度】1883. 准时抵达会议现场的最小跳过休息次数
|
4月前
|
人工智能 算法
第一周算法设计与分析 G : 排队援救
这篇文章介绍了解决算法问题"排队援救"的方法,通过使用队列和映射来模拟救援点的排队过程,并确定最终得到救援的人的顺序和编号。
|
6月前
|
程序员
程序员必知:将时间的秒数转化为分钟数
程序员必知:将时间的秒数转化为分钟数
113 0
|
7月前
leetcode-6112:装满杯子需要的最短总时长
leetcode-6112:装满杯子需要的最短总时长
47 0
|
算法
代码随想录算法训练营第五十二天 | LeetCode 300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
代码随想录算法训练营第五十二天 | LeetCode 300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
52 1
|
7月前
【每日一题Day115】LC2335装满杯子需要的最短总时长 | 贪心
【每日一题Day115】LC2335装满杯子需要的最短总时长 | 贪心
33 0
|
7月前
|
算法 Java API
算法编程(二十四):日期之间隔几天
算法编程(二十四):日期之间隔几天
79 0
|
存储 Cloud Native
【刷题日记】128. 最长连续序列
本次刷题日记的第 56 篇,力扣题为:128. 最长连续序列,中等
|
存储 算法 调度
C语言模拟银行排队叫号(顺序队)
C语言模拟银行排队叫号(顺序队)
246 0
图解LeetCode——2335. 装满杯子需要的最短总时长
图解LeetCode——2335. 装满杯子需要的最短总时长
59 0