(贪心1)排队接水

问题描述
  有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
输入格式
  第一行n,r (n<=500,r<=75)
  第二行为n个人打水所用的时间Ti (Ti<=100);
输出格式
  最少的花费时间
样例输入
3 2
1 2 3
样例输出
7

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
    int n,r;//n:人数,r:水龙头个数 
    cin>>n>>r;
    int a[100];
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);//要使每个人平均等待时间最小,接水时间小的排在前面

    //水龙头
    int tap[100];//记录每个水龙头的时间,下标是不同的水龙头,元素是时间 
    memset(tap,0,sizeof(tap));
    int j=1; 
    int sum=0;//总时间 
    for(int i=1;i<=n;i++){
        if(j==r+1) j=1;//水龙头的个数少于j,从第一个水龙头开始 
        tap[j]+=a[i];// 这个人在这个水龙头花去的时间 
        sum+=tap[j];//总时间(包含了一个人等待另一个人接水的时间 )
        //对每个接水时间T进行累加是下一个人的等待时间。对每个等待时间进行累加是总等待时间
        j++;
    }
    cout<<sum<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/80720213
今日推荐