蓝桥杯2020国赛 答疑

166 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

[蓝桥杯 2020 国 ABC] 答疑

题目描述

nn 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。

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

  1. 首先进入办公室,编号为 ii 的同学需要 sis_{i} 毫秒的时间。

  2. 然后同学问问题老师解答,编号为 ii 的同学需要 aia_{i} 毫秒的时间。

  3. 答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可以忽略。

  4. 最后同学收拾东西离开办公室,需要 eie_{i} 毫秒的时间。一般需要 1010 秒、2020 秒或 3030 秒,即 eie_{i} 取值为 100001000020000200003000030000

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

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

输入格式

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

接下来 nn 行, 描述每位同学的时间。其中第 ii 行包含三个整数 si,ai,eis_{i}, a_{i}, e_{i},意义如上所述。

输出格式

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

样例 #1

样例输入 #1

3
10000 10000 10000
20000 50000 20000
30000 20000 30000

样例输出 #1

280000

提示

【样例说明】

按照 1,3,21,3,2 的顺序答疑,发消息的时间分别是 20000,80000,18000020000,80000,180000

【评测用例规模与约定】

对于 30%30 \% 的评测用例, 1n201 \leq n \leq 20

对于 60%60 \% 的评测用例, 1n2001 \leq n \leq 200

对于所有评测用例, 1n1000,1si60000,1ai10000001 \leq n \leq 1000,1 \leq s_{i} \leq 60000,1 \leq a_{i} \leq 1000000, ei{10000,20000,30000}e_{i} \in\{10000,20000,30000\} ,即 eie_{i} 一定是 10000200003000010000 、 20000 、 30000 之一。

蓝桥杯 2020 年国赛 A 组 H 题(B 组 H 题, C 组 J 题)。

思路

其实这题我有一种猜答案之嫌,主要思路其实就是贪心,但是对哪个时间贪心,其实是一个问题,进入办公室和答疑的时间可以连为一体,然后按照离开时间和总时间排序贪心即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string> 
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stack> 
#include <cmath>
#include <iomanip>
#define ll long long
#define AC return
#define Please 0
using namespace std;
const int N=1010;
const double eps=1e-9;
typedef pair<int,int>PII;
typedef unsigned long long ull; 
int n,d,k;
bool flag[N];
inline int read(){//快读 
    int x=0,f=1;char ch=getchar();
    while(ch<'0' || ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9'){
        x=x*10+ch-'0'; 
        ch=getchar();
    }
    AC x*f;
}
struct tim{
    int send,lev,end;
}ti[N];
bool cmp(tim x,tim y){
    return x.end<y.end;
}
ll sum[N],ans=0;
int main(){
    n=read();
    for(int i=1;i<=n;i++){
        int s,a,t;
        s=read(),a=read(),t=read();
        ti[i]={s+a,t,s+a+t};
    }
    sort(ti+1,ti+n+1,cmp);
    sum[1]=ti[1].send;
    for(int i=2;i<=n;i++){
        sum[i]=sum[i-1]+ti[i-1].lev+ti[i].send;
    }
    for(int i=1;i<=n;i++){
        ans+=sum[i];
    }
    cout<<ans<<endl;
    AC Please;
}

希望能帮助到大家(QAQQAQ)!