洛谷 T184172 「EZEC-10」打分

题目链接
可以采用一个贪心的思路
设裁判打的分分别为\(a_1,a_2,a_3,a_4,a_5\),从小到大排序,我们往上面加分
首先可以想到把尽可能多的\(a_i(i\leq 5)\)加到\(a_5\)
如果有多的再平均分给所有的\(a_i\)
但是加最小的\(a_1\)是没有意义的,最小的一定会被舍去
那就把\(a_2\)到\(a_5\)全部加到\(a_5\)
但是\(a_4\)比\(a_3\)和\(a_2\)离\(a_5\)近,所以将\(a_4\)加到\(a_5\)要花的代价是最小的
就从倒着来一个一个加成\(a_5\),直到\(i\)为\(2\)或者\(m\)为\(0\)为止
剩下的就平均分给\(a_2\)到\(a_5\),只给一个是没意义的,最大的那个会被舍去
注意要开\(long\ long\)

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mp make_pair
#define reg register int
#define msz(a) memset(a, 0, sizeof a);
#define rep1(i, j, n) for (reg i = j; i <= n; ++i)
#define rep2(i, j, n) for (reg i = j; i >= n; --i)
typedef long long LL;
typedef pair <int, int> PII;
const int INF1 = 0x3f3f3f3f, INF2 = 0x7fffffff;
const int MAXN = 1e5 + 5;
int n, m, a[MAXN], sum, minn = LLONG_MAX, maxn;
signed main() {
	scanf("%lld%lld", &n, &m);
	rep1(i, 1, n) scanf("%lld", a + i);
	sort(a + 1, a + n + 1);
	rep2(i, n - 1, 2) {
		if (m >= a[n] - a[i]) m -= (a[n] - a[i]), a[i] = a[n];
		else a[i] += m, m = 0;
	}
	if (m > 0) {
		rep2(i, n, 2) a[i] += m / (n - 1);
		m -= (m / (n - 1) * (n - 1));
		rep2(i, n, 2) {
			if (m == 0) break;
			++a[i], --m;
		}
	}
	sort(a + 1, a + n + 1);
	rep1(i, 2, n - 1) sum += a[i];
	printf("%lld", sum);
	return 0;
}
上一篇:NYOJ 998 解题报告


下一篇:1096 Consecutive Factors (20 分)