题意描述:
现在有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;
}