在测试点 2 答案错误
查看原帖
在测试点 2 答案错误
637788
kimi0705楼主2023/7/29 13:01
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int K = 1e3 + 10;
const int L = 1e4 + 10;
const int M = 1e5 + 10;
const int N = 1e6 + 10;
int t, n, k, ans;
int arr[2 * M], sum[2 * M], Sum, Point;
signed main() {
	//	freopen (".\\data\\in.txt", "r", stdin);
	//	freopen (".\\data\\out.txt", "w", stdout);
	ios::sync_with_stdio (false);
	cin.tie (0);
	cout.tie (0);
	cin >> t;
	while (t--) {
		ans = INT_MAX;
		cin >> n >> k;
		for (int i = 1; i <= n; i++) cin >> arr[i];
		if (n == 1) {
			cout << max (0LL, arr[1] - k) << '\n';
			continue;
		}
		sort (arr + 1, arr + n + 1); // 排序
		sum[n] = arr[n];
		for (int i = n - 1; i; i--) sum[i] = sum[i + 1] + arr[i]; // 后缀和
		Sum = sum[1], Point = 1;
		for (int i = 0; i <= ans; i++) { // 枚举将 a[1] 减 i 次
			while (Sum - (sum[Point + 1] - (arr[1] - i) * (n - Point) ) <= k && Point <= n) Point++; // 找到第一个可以的地方
			if (Point != 1)
				ans = min (ans, i + n - Point + 1);
			Sum--;
		}
		cout << ans << '\n';
	}
	return 0;
}
2023/7/29 13:01
加载中...