CodeForces-Eating Candies

题目

题目思路

首先,题目明确说明必须连着吃,不可以跳着吃,所以我们可以固定好左边的人,然后枚举他从 \(1\)\(N\),至于右边的人,我们可以使用后缀和与左边吃糖果的总和进行对比,采用二分,我的二分这里看起来和另一个题解不同,也是我本篇题解提交的原因,希望给读者更多的二分写法以及思路。受启发于传送门,感兴趣的朋友们可以看下。

代码实现

代码简洁并且配有注释

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int range = 2e5 + 5;
int n;
int a[200005];
int sum[200005];
int hsum[200005];
void solve() {
	cin >> n;
	sum[0] = 0;
	hsum[n + 1] = 0;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		sum[i] = sum[i - 1] + a[i];
	}//前缀和
	for (int i = n; i >= 1; i--) {
		hsum[i] = hsum[i + 1] + a[i];
	}//后缀和
	int ans = 0;
	//固定左边的人 从1到n枚举
	for (int i = 1; i <= n; i++) {
		int l = i;
		int r = n;
		int kawayi = 1e9;
		while (l < r) {//这样不写等号 就可以让一方改变即可
			int mid = l + r + 1 >> 1;//使用l+r+1 有一点好处 就是防止死循环
			if (sum[i] - hsum[mid] <= 0) {
				l = mid;
				if (sum[i] == hsum[mid])kawayi = min(kawayi, mid);//保存答案
			} else r = mid - 1;
		}
		if (kawayi != 1e9)
			ans = max(i + (n - kawayi + 1), ans);
	}
	cout << ans << endl;
	return ;
}
signed main() {
	ios::sync_with_stdio();
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while (t--)
	solve();
	return 0;
}

感谢观看!

posted @ 2025-04-16 19:58  LteShuai  阅读(30)  评论(0)    收藏  举报