A i + A i+1 + … + A j ≤ (j – i + 1) + N 等价于 A i-1 + A i+1-1 + … + A j -1≤ N 直接求最大子段和与N比较即可。 #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <string> #include <algorithm> using namespace std; const int MAX = 30010; int a[MAX]; int main() { int n,s; scanf("%d%d",&n,&s); for(int i=0; i<n; i++) { scanf("%d",&a[i]); a[i]--; } int mmax = INT_MIN,sum = 0; for(int i=0; i<n; i++) { if( sum > 0 ) sum += a[i]; else sum = a[i]; if( sum > mmax ) mmax = sum; } if( mmax <= s ) printf("YES/n"); else printf("NO/n"); return 0; }