编程语言
首页 > 编程语言> > 试题 算法训练 排队接水2

试题 算法训练 排队接水2

作者:互联网

问题描述

  有N个人排队到M个水龙头去打水,他们装满水桶的时间T1,T2……Tn为整数且各不相等,应如何安排他们的打水顺序才能使他们花费的总时间最少?

输入格式

  第1行:两个整数n和m,n表示人的个数,m表示水龙头的个数;
  第2行,n个数分别表示n个人装水的时间
  数据范围:m<=n/3,n<=1000,t<3000。

输出格式

  一个整数,表示总花费的最少时间。

样例输入

6 2
5 4 6 2 1 7

样例输出

40

#include <iostream>
#include<algorithm>
using namespace std;

int v[100002];//水量
int w[100002];//接水点
int main(int argc, char** argv) {
	
int n,m,sum=0;

cin>>n>>m;
for(i=0;i<n;i++)
cin>>v[i];
sort(v,v+n);//从小到大排序 
for(i=0;i<n;i++)
{
  
  y=0;
  for(j=0;j<m;j++)//找出最小值,即先接完水的水龙头
  {if(w[j]<w[y])
  y=j;}
  w[y]+=v[i];//安排接完水的排上队伍
  sum+=w[y];//直接算出每个接水点的时间和 
}

cout<<sum;
	return 0;
}

另一种解法

#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include <string>
#include <math.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int v[100002];//接水量
int w[100002]={0};//服务点
int o[100002]={0};//总服务时间

int main(int argc, char** argv) {
	
int n,m,i,j,sum=0;
j=0;

cin>>n>>m;
for(i=0;i<n;i++)
cin>>v[i];
sort(v,v+n);//从小到大排序 
for(i=0;i<n;i++)
{
  w[j]+=v[i];
  o[j]+=w[j];
  j++;
   j %= m; //共用m个服务点,故j对s取模
}

for(i=0;i<m;i++)
sum+=o[i];
cout<<sum;
	return 0;
}

标签:试题,using,int,sum,个数,算法,100002,接水,include
来源: https://blog.csdn.net/qq_54251913/article/details/123037133