有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。
老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。
一位同学答疑的过程如下:
首先进入办公室,编号为 i 的同学需要 si 毫秒的时间。
然后同学问问题老师解答,编号为 i 的同学需要 ai 毫秒的时间。
答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可以忽略。
最后同学收拾东西离开办公室,需要 ei 毫秒的时间。一般需要 10 秒、20 秒或 30 秒,即 ei 取值为 10000,20000 或 30000。
一位同学离开办公室后,紧接着下一位同学就可以进入办公室了。
答疑从 0 时刻开始。老师想合理的安排答疑的顺序,使得同学们在课程群里面发消息的时刻之和最小。
输入第一行包含一个整数 n,表示同学的数量。
接下来 n nn 行,描述每位同学的时间,其中第 i 行包含三个整数 si,ai,ei 意义如上所述。
输出一个整数,表示同学们在课程群里面发消息的时刻之和最小是多少。
3
10000 10000 10000
20000 50000 20000
30000 20000 30000
280000
按照 1 , 3 , 2 的顺序答疑,发消息的时间分别是 20000 , 80000 , 180000 。
对于 30% 的评测用例,1 ≤ n ≤ 20
对于 60% 的评测用例,1 ≤ n ≤ 200
对于所有评测用例,
1 ≤ n ≤ 1000 ,
1 ≤ s i ≤ 60000 ,
1 ≤ a i ≤ 1000000 ,
e i ∈ 10000 , 20000 , 30000
这道题主要考的是贪心算法,首先,我们需要明白题目中在课程群里面发消息的时刻之和最小是怎么得到的,即(n-i)*stu[i].b+(n-i-1)*stu[i].e第1个同学的前俩个数字和的n-i倍加上第一个同学的最后一个数字的n-i-1倍,依次类推累加。而对于n个同学的排序是先比较时间总和,时间总和小的排前面,如果时间总和相等时,需要再比较前俩个数字和,前俩个数字和小的排前面,因为前俩个数字需要乘的倍数大,排好序后累加即可。
- #include
- using namespace std;
-
- struct Student {
- int s, a, e;
- int num, b;
- } stu[1010];
-
- bool cmp(Student a, Student b) {
- if(a.num!=b.num) {
- return a.num
- } else {
- return a.b
- }
- }
-
- int main() {
- int n;
- int i, j;
- scanf("%d", &n);
- for(i=0; i
- scanf("%d %d %d", &stu[i].s, &stu[i].a, &stu[i].e);
- stu[i].num=stu[i].s+stu[i].a+stu[i].e;
- stu[i].b=stu[i].s+stu[i].a;
- }
- sort(stu, stu+n, cmp);
- // for(i=0;i
- // printf("%d %d %d\n", stu[i].s, stu[i].a, stu[i].e);
- // }
- long long int sum=0, p=0;
- for(i=0; i
- sum+=((n-i)*stu[i].b+(n-i-1)*stu[i].e);
- }
-
- printf("%lld", sum);
- return 0;
-
- }
-
相关阅读:
机器学习--Transformer 1
使用requests库进行网络爬虫:IP请求错误的解决方法
Linux history 命令相关使用以及配置
适合玩游戏的蓝牙耳机有哪些?低延迟蓝牙耳机推荐
disruptor (史上最全之1):伪共享原理&性能对比实战
数字孪生智慧场馆|智慧协同,立体可控,节省方案智能化建设投资
Simulink-模块Moudle调用回调函数步骤
【LeetCode75】第五十五题 寻找峰值
移动电源外贸出口亚马逊UL2056测试报告周期
【优化路由】模拟退火算法改进遗传算法HGA求解QOS组播路由优化问题(目标函数:网点位置)【含Matlab源码 4608期】
-
原文地址:https://blog.csdn.net/m0_51664084/article/details/130860893