答疑(蓝桥杯)

文章目录

答疑

问题描述

有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。

老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。

一位同学答疑的过程如下:

  1. 首先进入办公室,编号为 i 的同学需要 si 毫秒的时间。
  2. 然后同学问问题老师解答,编号为 i 的同学需要 ai 毫秒的时间。
  3. 答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可以忽略。
  4. 最后同学收拾东西离开办公室,需要 ei 毫秒的时间。一般需要 10 秒、20 秒或 30 秒,即 ei 取值为 10000 ,20000 或 30000 。

一位同学离开办公室后,紧接着下一位同学就可以进入办公室了。

答疑从 0 时刻开始。老师想合理的安排答疑的顺序,使得同学们在课程群里面发消息的时刻之和最小。

输入格式

输入第一行包含一个整数 n ,表示同学的数量。

接下来 n 行,描述每位同学的时间,其中第 i 行包含三个整数 si,ai,ei ,意义如上所述。

输出格式

输出一个整数,表示同学们在课程群里面发消息的时刻之和最小是多少。

样例输入

复制代码
3
10000 10000 10000
20000 50000 20000
30000 20000 30000

样例输出

复制代码
280000

数据范围

对于 30% 的评测用例,1≤n≤20

对于 60% 的评测用例,1≤n≤200

对于所有评测用例,1 ≤ n ≤ 1000 , 1 ≤ si ≤ 60000 , 1 ≤ ai ≤ 1000000 , ei ∈ 10000 , 20000 , 30000 ,即 ei 一定是 10000 、 20000 、 30000 之一。

贪心

这段代码是用来解决上述答疑问题的,旨在找到一种答疑顺序,使得同学们在群里发消息的时刻之和最小。下面是代码的详细注释,解释每一部分的作用:

cpp 复制代码
#include<bits/stdc++.h> // 引入常用库文件,这是编程比赛中常用的简写方式
using namespace std;    // 使用标准命名空间
typedef long long ll;   // 定义长整型别名 ll,便于处理大整数

// 定义数组,对应 n 位同学的进入办公室时间、答疑时间和离开办公室时间
int si[1010],ai[1010],ei[1010];
// 定义数组 s 用来存储每位同学答疑的总时间(包括进入、答疑和离开时间)
ll s[1010];

int main()
{
    int n; // 定义变量 n 来存储同学的数量
    cin>>n; // 从标准输入读取同学的数量
    ll d=0; // 定义变量 d 用于记录初始的发消息的时刻之和
    
    // 循环读取每位同学的时间数据
    for(int i=0;i<n;i++)
    {
        cin>>si[i]>>ai[i]>>ei[i]; // 读取第 i 位同学的进入、答疑和离开时间
        s[i]=si[i]+ai[i]+ei[i];   // 计算每位同学的总答疑时间
        d+=si[i]+ai[i]; // 累加进入和答疑时间到 d,注意离开时间在这里不计入
    }
    
    // 使用 sort 函数对 s 数组进行排序,按照答疑的总时间从小到大排序
    sort(s,s+n);
    
    // sum 初始值为 d,即所有同学的进入和答疑时间之和
    ll sum=d;
    
    // 这个循环计算排序后的答疑时间对发消息时刻之和的影响
    int t=n; // 定义变量 t 为同学数量
    for(int i=0;i<n-1;i++)
    {
        sum+=(t-1)*s[i]; // 乘以 t-1 是因为每个 s[i] 会被后面的同学重复经历
        t--; // 每次循环后,影响的同学数减少一个
    }
    
    cout<<sum; // 输出计算出的同学们在课程群里面发消息时刻之和
    return 0; // 程序正常结束
}

这段代码实现了一个高效的算法,通过先累加所有同学的进入和答疑时间,然后排序并计算每个同学离开办公室的时间对后面同学发消息时刻的影响,最后得到一个最小化的发消息时刻之和。

相关推荐
香蕉卜拿拿拿4 小时前
软件解耦与扩展的利器:基于C++与C#的插件式开发实践
c++
CoderCodingNo6 小时前
【GESP】C++五级真题(贪心和剪枝思想) luogu-B3930 [GESP202312 五级] 烹饪问题
开发语言·c++·剪枝
阿闽ooo7 小时前
深入浅出适配器模式:从跨国插头适配看接口兼容的艺术
c++·设计模式·适配器模式
oioihoii9 小时前
跨越进程的对话之从管道到gRPC的通信技术演进
c++
爱装代码的小瓶子9 小时前
算法【c++】二叉树搜索树转换成排序双向链表
c++·算法·链表
阳洞洞10 小时前
cmake中如何从include_directories中移除某个特定的头文件
c++·cmake
墨雪不会编程10 小时前
C++【string篇1遍历方式】:从零开始到熟悉使用string类
java·开发语言·c++
蓝色汪洋11 小时前
经典修路问题
开发语言·c++·算法
DARLING Zero two♡12 小时前
接入 AI Ping 限免接口,让 GLM-4.7 与 MiniMax-M2.1 成为你的免费 C++ 审计专家
开发语言·c++·人工智能
程序喵大人12 小时前
constexpr
开发语言·c++·constexpr