codeforces 之 Design Tutorial: Learn from Life

本文介绍了一种关于电梯调度的贪心算法问题,通过将人员按目标楼层升序排列,并利用电梯每次最多装载K人的限制,实现总耗时最小化的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意描述:

现在有N个人在1楼等着乘电梯,而电梯每次只能装K个人,设第I个人要到第J层,那么这个人将花费时间(J-1),问如何安排这些人,花费的时间最少?

看到这道题后,表示自己走运了,之前做过一道几个人拿着电灯过河的问题,也是人的安排,感觉他们很相似,所以第一反应就是分组,每次电梯上升,由花费时间少的来载一个花费时间多的,最后老是跪在第七个样例,后来,实验室的一个小强说他是按花费时间的多少,从高到低来算的,我瞬间就明白了尴尬尴尬。。。。

题意分析:

这是一道贪心题,有N个人,按从小到大排序,每个人都要到达自己所要去的 层,所以,分组,由到达最高层的人来带走相对他较低层的人,也就是从小到大分组。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main() {
int n,i,k,a[2010],sum=0,flag=0;
cin>>n>>k;
for(i=1; i<=n; i++) {
cin>>a[i];
if(k==1) {
sum+=(a[i]-1)*2;
flag=1;
}
}
if(flag == 1) {
cout<<sum<<endl;
return 0;
}
sort(a+1,a+n+1) ;
for(i=n; i>=1; ) {
sum+=(a[i]-1)*2;
i = i-k;
}
cout<<sum<<endl;
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值