不管有几处可以提供服务的窗口,只要将服务时间进行排序即可。
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<memory.h>
#include<cstdio>
#include<list>
#include<string>
#include<map>
#include<cmath>
#include <algorithm>
#include <queue>
#define NUM 1000
#define maxint 10000000
#define INF 0x3f3f3f3f
using namespace std;
int c[NUM][NUM];//用邻接矩阵存储边和权
int dist[NUM];
string a;
int k;
double greedy(vector<int> client, int s)
{
double t = 0;
vector<int> service(s,0);//记录每个人等待的时间
vector<int> sum(s,0);//记录每个窗口等待的总时间
sort(client.begin(),client.end());
int i = 0;
int j = 0;
while(i<client.size())
{
service[j%s] += client[i++];
sum[j%s] += service[j%s];
j++;
}
for(int i = 0;i<s;i++)
{
t+= sum[i];
}
return t;
}
int main()
{
freopen("in.txt", "r", stdin);
vector<int> v ;
int num ;
int s;
while(cin>>num>>s)
{
int temp;
for(int i = 0;i<num;i++)
{
cin>>temp;
v.push_back(temp);
}
printf("%.3f\n",greedy(v,s)/num);
}
}
输入:
10 2
56 12 1 99 1000 234 33 55 99 812
输出:
336.000