问题描述
有
n
个⼈排队到
r
个⽔⻰头去打⽔,他们装满⽔桶的时间
t1
、
t2………..tn
为整数且各不相等,应如何安
排他们的打⽔顺序才能使他们总共花费的时间最少?
输⼊格式
第⼀⾏
n
,
r (n<=500,r<=75)
第⼆⾏为
n
个⼈打⽔所⽤的时间
Ti (Ti<=100)
;
输出格式
最少的花费时间
样例输⼊
3 2
1 2 3
样例输出
7
数据规模和约定
其中
80%
的数据保证
n<=10
贪心和动态规划的题目还不是太会,学了一下别人的做法,首先就是要注意到先把时间进行一个升序排序,一个人等待时间等于他前面的人等待的时间加上它自己的时间,所用时间越小的人先排,可以使较大的时间重复计算的次数减少。然后就是遍历计算时间。
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string>
using namespace std;
bool cmp(int a,int b)
{
return a<b;
}
int main()
{
int n,r;//有n个人,r个水龙头
cin>>n>>r;
int time[n];
for(int i=0;i<n;i++)
{
cin>>time[i];
}
sort(time,time+n,cmp);
int pipe[r]={0};
int cnt=0;
int t=0;
for(int i=0;i<n;i++)
{
pipe[cnt]+=time[i];
t+=pipe[cnt];
cnt++;
if(cnt==r) cnt=0;//进行第二轮循环遍历所有水龙头
}
cout<<t;
}