目录
题目描述
输入描述
输出描述
解析
完整代码
描述
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1,t2,...,tn为整数且各不相等,应如何安排他们的打水顺序才能使他们花费的总时间最少?
每个人打水的时间 = 排队的时间 + 实际打水的时间,本题假设一个人打好水,排在他后面的人接着打水的这个切换过程不消耗时间。
比如,有2个人A和B,他们打水的时间分别是3和2,只有1个水龙头,这时,如果A先打水,B后打水,那么A和B打水的时间分别为3、3+2(B排队3分钟)。
因此,所有人打水的总时间就是每个人的打水时间及每个人的排队时间的总和。
输入描述
第1行,两个整数n(1<=n<=500)和r(1<=r<=100)。
第2行,n个正整数t1,t2,…,tn,(1<=ti<=1000)表示每个人装满水桶的时间。
输出描述
1行,一个正整数,表示他们花费的最少总时间。
用例输入 1
4 2 2 6 4 5
用例输出 1
23
来源
贪心
兄弟们啊,不是你们c++学不会,而是个别老师他教不对啊。
来,就这贪心题你看着懵不懵,懵不懵!
看看老高平时是怎么教我的:
这题的主要功能是读取两个整数 n
和 r
,然后读取 n
个整数存入数组 a
中。之后,对数组 a
进行排序,并按照特定的规则更新数组中的时间最后计算并输出数组所有时间的总和。
详细步骤如下:
-
输入:
cin>>n>>r;
首先,程序读取两个整数
n
和r
,表示有n个人排队到r个水龙头去打水。 -
读取数组:
for(int i=1;i<=n;i++)cin>>a[i];
接着,程序读取
n
个整数,并将它们存储在数组a
中,他们装满水桶的时间a1,a2,...,an为整数且各不相等。 -
排序:
sort(a+1,a+n+1);
使用
sort
函数对数组a
进行排序,以便后续处理。 -
更新数组、计算总和:
for(int i=1;i<=n;i++){ if(i>r){ a[i]+=a[i-r]; } sum+=a[i]; }
遍历数组
a
,对于每个索引i
,如果i
大于r
,则将a[i]
的值更新为a[i] + a[i-r]
。这个步骤实际上是将当前时间与其前面第r
个时间相加。:遍历更新后的数组a
,计算所有元素的总和,并将结果存储在变量sum
中。 -
输出:最后,输出变量
sum
的值,即最短时间的总和。
简而言之,这段代码的目的是在读取一系列整数并对它们排序后,根据给定的 r
值更新每个时间的值,然后计算并输出更新后数组的所有时间的总和。
结束了!
对了,忘说了一句话:
要想c++成绩好,就来jiabei小课堂。
还有,点我主页,看我简介,别给那三个人点赞就完了
下面出示代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,r,a[10001],sum=0;
cin>>n>>r;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
if(i>r){
a[i]+=a[i-r];
}
sum+=a[i];
}
cout<<sum;
return 0;
}