问题描述
有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; }