求 hack(悬关)
查看原帖
求 hack(悬关)
726139
残阳如血楼主2024/7/9 07:49

提交记录

#include <iostream>
#include <algorithm>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
using lint = long long;
const int N = 2e5 + 10;

struct Data {
	int a, t, id, st;
} arr[N];

lint s[N];
int T, ans, n, c;

bool check(int k, int i, int lim) {
	// 还要传送 k 次,第一次传送是在 i,剩余的钱数为 lim
	int cost;
	if (i > k) {
		cost = s[k];
	} else {
		cost = s[k + 1] - arr[i].t;
	}
	return cost <= lim;
}

int main() {
	std::cin.tie(0)->sync_with_stdio(0);
	for (std::cin >> T; T; --T) {
		std::cin >> n >> c, ans = 0;
		for (int i = 1; i <= n; ++i) {
			std::cin >> arr[i].a;
			arr[i].st = (arr[i].id = i) + arr[i].a;
			arr[i].t = min(i, n + 1 - i) + arr[i].a;
		}
		std::sort(arr + 1, arr + n + 1, [](const Data &p, const Data &q){
			return p.t < q.t;
		});
		for (int i = 1; i <= n; ++i) s[i] = s[i - 1] + arr[i].t;
		for (int i = 1; i <= n; ++i) { // 枚举第一个前往的位置
			if (arr[i].a + arr[i].id > c) continue;
			// 二分还能传送的次数
			int l = -1, r = n;
			while (l + 1 != r) {
				int mid = l + r >> 1;
				if (check(mid, i, c - arr[i].a - arr[i].id)) l = mid;
				else r = mid;
			}
			ans = max(ans, l + 1);
		}
		std::cout << ans << '\n';
	}
	std::cout.flush();
	return 0;
}
2024/7/9 07:49
加载中...