试题 算法训练 排队接水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