持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
[蓝桥杯 2020 国 ABC] 答疑
题目描述
有 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。
一位同学答疑的过程如下:
-
首先进入办公室,编号为 的同学需要 毫秒的时间。
-
然后同学问问题老师解答,编号为 的同学需要 毫秒的时间。
-
答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可以忽略。
-
最后同学收拾东西离开办公室,需要 毫秒的时间。一般需要 秒、 秒或 秒,即 取值为 、 或 。
一位同学离开办公室后,紧接着下一位同学就可以进入办公室了。
答疑从 时刻开始。老师想合理的安排答疑的顺序,使得同学们在课程群里面发消息的时刻之和最小。
输入格式
输入第一行包含一个整数 ,表示同学的数量。
接下来 行, 描述每位同学的时间。其中第 行包含三个整数 ,意义如上所述。
输出格式
输出一个整数,表示同学们在课程群里面发消息的时刻之和最小是多少。
样例 #1
样例输入 #1
3
10000 10000 10000
20000 50000 20000
30000 20000 30000
样例输出 #1
280000
提示
【样例说明】
按照 的顺序答疑,发消息的时间分别是 。
【评测用例规模与约定】
对于 的评测用例, 。
对于 的评测用例, 。
对于所有评测用例, , ,即 一定是 之一。
蓝桥杯 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;
}
希望能帮助到大家()!