题目
题意
给你n个敌人和k个士兵,一个士兵同时只能对抗一个敌人,每个士兵的抵抗时间有限且已给出,问你如何安排才能拖延最长的时间。
题解
思路
(1)首先如果只有n个敌人,取最小的那个即为最长时间。
(2)先选出n个时间最长的n个士兵,再用剩余士兵的时间从最小的那个开始分配时间看最终能分配到哪里,哪里就可以算出最长时间。
(3)若能分配到选出来的所有士兵,则直接算出所有士兵的平均值即可。
AC代码
#include <bits/stdc++.h>
#define ll long long
#define Max 501
using namespace std;
double a[11000];
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
int n, m;
double sum = 0, s = 0;
cin >> m >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
s += a[i];
}
sort(a + 1, a + n + 1, cmp);
for (int i = m + 1; i <= n; i++)
sum += a[i];
int cnt = 1, ff = 0;
double xx = 0;
for (int i = m; i >= 1; i--)
{
if (sum >= ((a[i - 1] - a[i]) * cnt))
{
sum -= ((a[i - 1] - a[i]) * cnt);
cnt++;
}
else
{
ff++;
xx = a[i] + sum / cnt;
break;
}
}
if (ff == 0)
{
printf("%.9lf\n", s / m);
}
else
{
if (n > m)
printf("%.9lf\n", xx);
else
printf("%.9lf\n", a[n]);
}
return 0;
}