O(N^2)的最水算法会超时,只能用O(N*logN)算法。。想了半天也想不出来,虽然有二分提示。。最后还是看了题解,思路就是将步长二分
#include<stdio.h>
#include<stdlib.h>
int main()
{
int t;
scanf("%d", &t);
int *a = malloc(100001 * sizeof(int));
while (t--)
{
int n, s, i;
scanf("%d %d", &n, &s);
for (i = 0; i < n; i++)
scanf("%d", &a[i + 1]);
int sum = 0;
a[0] = 0;
for (i = 1; i <= n; i++)
{
sum += a[i];
a[i] = sum;
}
int min = 1, max = n, len = 0;
while (min <= max)
{
int mid = (min + max) / 2, find = 0;
for (i = n; i >= mid; i--)
{
if (a[i] - a[i - mid] >= s)
{
len = mid;
find = 1;
break;
}
}
if (find)
max = mid - 1;
else
min = mid + 1;
}
printf("%d\n", len);
}
return 0;
}