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;
}
感谢观看!

浙公网安备 33010602011771号