排队打水

问题描述

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

问题分析

各时间为:t1,t2, ... tn
总等待时间为:t1(n1)+t2(n2)+...+tn0
时间越小越先进行为最优解
证明: 假设ti<ti+1, 显然 ti+1(ni)+ti(ni1)>ti(ni)+ti+1(ni1)。 而且titi+1的交换对其它计算并没有影响,所以首先进行时间较小的能够获得最优解

代码实现

#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 1e5 + 10;

int n;
int a[N];

int main()
{
    cin >> n;
    for (int i = 0; i < n; ++ i) cin >> a[i];

    sort(a, a + n);

    LL res = 0;
    for (int i = 0; i < n; ++ i) res += a[i] * (n - i - 1);

    cout << res << endl;

    return 0;
}
posted @   0x7F  阅读(68)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示