#include <iostream> #include <vector> #include <algorithm> #include <climits> using namespace std; // 检查是否存在长度为length的子串,其和至少为m bool checkLength(int length, const vector<int>& candies, long long m) { int n = candies.size(); // 计算初始窗口(前length个元素)的和 long long window_sum = 0; for (int i = 0; i < length; i++) { window_sum += candies[i]; } if (window_sum >= m) return true; // 滑动窗口检查所有长度为length的子串 for (int i = length; i < n; i++) { window_sum = window_sum - candies[i - length] + candies[i]; if (window_sum >= m) return true; } return false; } int main() { int n; long long m; // 使用long long防止大数溢出 cin >> n >> m; vector<int> candies(n); long long total = 0; for (int i = 0; i < n; i++) { cin >> candies[i]; total += candies[i]; } // 如果总甜度小于m,直接输出0 if (total < m) { cout << 0 << endl; return 0; } int left = 1; // 最小可能长度 int right = n; // 最大可能长度 int result = n; // 记录最小满足条件的长度 // 二分查找最小满足条件的长度 while (left <= right) { int mid = left + (right - left) / 2; // 防止溢出 if (checkLength(mid, candies, m)) { result = mid; // 更新最小长度 right = mid - 1; // 尝试更小的长度 } else { left = mid + 1; // 需要更大的长度 } } cout << result << endl; return 0; } /************************************************************** Problem: 2105 User: hulaoshi Language: C++ Result: Accepted Time:97 ms Memory:2972 kb ****************************************************************/