排队打水问题

问题描述:

有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?

输入说明:

        第一行n,r (n<=500,r<=75)
  第二行为n个人打水所用的时间Ti (Ti<=100);

输出说明:

最少的花费时间

范例演示:

        输入:3 2
                   1 2 3

        输出:7

解题思路:

        每个水龙头都要排人,而每个水龙头排的第n个人的等待时间就是该水龙头前面n-1个人打水时间总和,而该人打水所用时间就是他的等待时间加上他打水的时间,每个人都是这样,而每个人的用时加起来就是总用时。让总用时最少就要让每个人的时间最少,而每个人打水时间不会变,那么就要让每个人等待时间最少,那就要求排在这个人前面的人的打水时间要比他少。

代码如下:

#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
    int n,r,sum=0;
    cin>>n>>r;
    int time[n],i,cnt=0;
    for(i=0; i<n; ++i) cin>>time[i];
    sort(time,time+n);
    int arr[r]= {0};//arr数组是储存每个水龙头的等待时间的
    for(i=0; i<r; ++i)
    {
        if(cnt==n) break;
        sum+=arr[i];//每到一个水龙头sum就加一次等待时间
        arr[i]+=time[cnt];//每上去一个人接水每个水龙头的等待时
                          //间就多上这个人的时间
        sum+=time[cnt++];//每排一个人都要加上这个人所需时间
        if(i==r-1) i=-1;//放完最后一个水龙头又排第一个
    }
    cout<<sum;
    return 0;
}

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Merran_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值