排序不等式——AcWing 913. 排队打水

排序不等式

定义

这主要涉及到利用 C++ 的排序操作对数据进行排序后,基于排序结果进行一些分析和处理。

运用情况

  • 对一组数据进行排序后,根据排序后的顺序来解决一些与顺序相关的问题,比如选取最大或最小的若干个元素。
  • 在一些需要按照特定顺序处理数据的算法中。

注意事项

  • 要注意选择合适的排序算法,不同的排序算法在时间复杂度和空间复杂度上可能有较大差异。
  • 对于有重复元素的情况,要考虑如何处理重复元素对结果的影响。

解题思路

  • 首先确定需要排序的数据类型和要求。
  • 选择合适的 C++ 排序算法(如冒泡排序、插入排序、快速排序等)对数据进行排序。
  • 根据排序后的结果,结合具体问题进行分析和计算。

例如,有一个包含多个整数的数组,要求找出前 k 个最大的数,可以先对数组进行排序,然后取前 k 个数。在这个过程中,要注意排序算法的效率以及对重复数的处理方式是否符合需求。

AcWing 913. 排队打水

题目描述

913. 排队打水 - AcWing题库

运行代码

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int t[N];
int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d", &t[i]);
    sort(t, t + n, greater<int>());
    LL res = 0;
    for (int i = 0; i < n; i ++ ) res += t[i] * i;
    printf("%lld\n", res);
    return 0;
}

代码思路

  • 首先定义了一些常量和变量,包括表示数据规模上限的 N,以及用于存储每个人打水时间的数组 t
  • 在 main 函数中,通过 scanf 读取人数 n 和每个人的打水时间。
  • 然后使用 sort 函数按照从大到小的顺序对打水时间进行排序(这里使用了自定义的比较函数 greater<int>)。
  • 接着通过循环计算总的等待时间。对于第 i 个人,前面已经有 i 个人打过水了,所以他需要等待的时间就是他自己的打水时间乘以 i,将所有这些等待时间累加到 res 中。
  • 最后将计算得到的总等待时间 res 输出。

这种思路的核心是先将打水时间降序排列,然后依次计算每个人的等待时间并求和,通过这种方式来得到最小的总等待时间。

改进思路

  1. 输入错误处理:可以添加对输入值的有效性检查,例如检查输入的人数 n 是否在合理范围内,以及每个人的打水时间是否为有效数值。
  2. 使用更高效的数据结构:如果数据规模非常大,考虑使用一些更高效的排序算法或数据结构来进一步优化性能。
  3. 代码注释:可以添加更多详细的代码注释,以提高代码的可读性和可维护性。
  4. 命名规范:确保变量和函数的命名更具描述性和规范性。
  5. 异常处理:考虑添加适当的异常处理机制,以应对可能出现的运行时异常情况。
  6. 代码结构优化:可以将计算等待时间的部分提取为独立的函数,使代码结构更加清晰。

其他代码

#include <iostream>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int t[N];
int main()
{cin>>n;
    for (int i = 0; i < n; i ++ )
 cin>>t[i];
    sort(t, t + n);
    LL res = 0;
    for (int i = 0; i < n; i ++ ) res += t[i] * (n-i-1);
   cout<<res<<endl;
    return 0;
}

代码思路

  • 首先通过 cin 读取人数 n
  • 然后通过循环读取每个人的打水时间并存入数组 t
  • 接着使用 sort 函数对数组 t 按从小到大排序,这样后面计算等待时间会更方便。
  • 在计算总等待时间时,从第一个人开始。对于第 i 个人,他前面有 n-i-1 个人已经打过水,所以他的等待时间就是他自己的打水时间 t[i] 乘以 (n-i-1),将所有这些等待时间累加到 res 中。
  • 最后输出计算得到的总等待时间 res
  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱姌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值