点名勾股之父——王白告。

*17岁天才铁驭边境顶尖猎杀者*  •  1年前


这是一道二分答案的题目,目标是找到最小的正整数 x,使得对于数组 a 中的任意一个前缀,其和都大于 -x。

const int N = 666666; 声明一个常量表示数组的大小。

int n, a[N]; 声明整数变量 n 和数组a,存储输入的数据。

bool check(int x) 函数用于判断二分答案 x 是否可行。函数中定义一个变量 cur,初始值为 x,然后遍历数组 a 中的每个元素,将 cur加上当前元素的值,如果 cur 变成了负数,说明当前前缀和小于等于 -x,返回 false,否则继续遍历。最终返回 true,表示对于任意前缀和都大于 -x。

int main() 主函数。

cin >> n; 输入 n。

for (int i = 0; i < n; i++) cin >> a[i]; 输入数组 a中的 n 个元素。

int l = 1, r = 1e9; 定义初始的二分答案区间 [1,10^9],l 表示左端点,r 表示右端点。

while (l < r) 在二分答案的区间上不断缩小区间,直到 l 和 r 相等为止。

int mid = (l + r) >> 1; 计算当前的二分答案 mid(等价于 (l+r)/2)。

if (check(mid)) r = mid; 如果 mid 可行,将右端点更新为 mid,并继续向左二分。

else l = mid + 1; 如果 mid 不可行,将左端点更新为 mid+1,并继续向右二分。

cout << l << endl; 输出最小的正整数 x


评论:

我是小丑,通知蝙蝠侠。


*17岁天才铁驭边境顶尖猎杀者*  •  1年前

请先登录,才能进行评论