求一段长为n序列的最大平均值子序列,子序列的长度最小为F. 类似于最大连续字段和的做法 #include <iostream> #define MAXN 100010 using namespace std ; __int64 a[MAXN] , sum[MAXN] ; int main () { __int64 n , m , i , j , k , s , ncows , nfields ; scanf ("%I64d%I64d" , &n , &m) ; for (i = 0 ; i < n ; i ++) scanf ("%I64d" , &a[i]) ; for (sum[m - 1] = i = 0 ; i < m ; i ++) sum[m - 1] += a[i] ; for (; i < n ; i ++) sum[i] = sum[i - 1] - a[i - m] + a[i] ; for (i = m , s = ncows = sum[i - 1] , j = nfields = i ; i < n ; i ++) { if ((s + a[i]) * m < sum[i] * (j + 1)) s = sum[i] , j = m ; else s += a[i] , j ++ ; if (s * nfields > ncows * j) ncows = s , nfields = j ; } printf ("%I64d/n" , 1000*ncows/nfields) ; return 0 ; }