问题描述 有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少? 输入格式 第一行n,r (n<=500,r<=75) 第二行为n个人打水所用的时间Ti (Ti<=100); 输出格式 最少的花费时间 样例输入 3 2 1 2 3 样例输出 7 数据规模和约定 其中80%的数据保证n<=10
这个问题的难度不在于贪心选择,肯定都是要时间越短的越靠前接水
因为他们的接水时间是固定的,必须要他们的等待时间最短才能保证总时间是最短的
这个问题难点在于怎么计算总时间
计算方法是,另找一个数组,把本题的人的总时间存储起来
前r 个排队时间是0,直接存本身,后面的是自己的排队时间加上自己的时间,
其实排序完成后,时间已经是固定的了。
#include <iostream> #include <algorithm> using namespace std; int a[1000]; int b[1000]; int main() { int n; int r; int sum=0; cin>>n; cin>>r; for(int i=0;i<n;i++) { cin>>a[i]; } sort(a,a+n); for(int j=0;j<r;j++) { b[j]=a[j]; } for(int i=r;i<n;i++) { b[i]=b[i-r]+a[i]; } for(int x=0;x<n;x++) { sum=sum+b[x]; } cout<<sum; return 0; }