前言
这题不难,可能有更好的解法,笔者的方法通俗易懂,希望大家都能A掉这道题
先看题目
时间限制:1s
空间限制:256mb
问题描述
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2、t3……tn为整数,应如何安排他们的打水顺序才能使每个人花费的时间的总和最少?
输入格式
第一行为n和r (n<1000,r<100
)
第二行为t1、t2、t3……tn
输出格式
一个整数,最少花费的总时间
样例输入 1
3 2
1 2 3
样例输出 1
7
样例输入 2
4 2
2 6 4 5
样例输出 2
23
开始解题
这是一道明显的贪心算法题,注意题目中要求的答案是所有人打水(包括排队)的时间总和,而每个人的打水时间已给出,所以只需让每个人的等待时间最短即可。
是个人都知道 我们知道,想让排队时间短,就可以用贪心的思想,让打水时间少的人排前面,让打得快的站前面,而求出打水快的人就要排序,用sort快排显然更省事,后面一个循环遍历打水时间,将排好序的数组存进相对应的水龙头,再循环累加总和即为答案。
代码详解
定义部分不多说,s为水龙头,arr为打水时间,注意数据范围
int n,r,sum,s[1005],arr[1005],k;
输入……
cin>>n>>r;
for(int i=1;i<=n;i++)cin>>arr[i];
排序……
sort(arr+1,arr+n+1);
重点来了!!!
for(int i=1;i<=n;i++){//这是打水时间的遍历下标
k++;//这是水龙头的遍历下标
if(k==r+1)k=1;//如果水龙头遍历完了,从头来
s[k] += arr[i];//水龙头数组上对应的值就是前面人的打水时间(等待时间)以及新的打水时间
sum += s[k];//累加答案
}
输出……
cout<<sum;
我的任务完成了
代码
新鲜的代码~
#include <bits/stdc++.h>
using namespace std;
int n,r,sum,s[1005],arr[1005],k;
int main(){
cin>>n>>r;
for(int i=1;i<=n;i++)cin>>arr[i];
sort(arr+1,arr+n+1);
for(int i=1;i<=n;i++){
k++;
if(k==r+1)k=1;
s[k] += arr[i];
sum += s[k];
}
cout<<sum;
return 0;
}
结语
这道题贪心思想较为简单,只是代码有点抽象