原题链接:https://www.acwing.com/problem/content/104/
题目分析
去掉题目的背景:有一组数,需要选择连续的至少Y个数字,让其平均值最大
这道题可以用二分法做,显然我们可以一步步逼近这个最大值,
代码细节
最后乘以1000因为结果可能是小数,1000向下取整数就是精确到了小数点后面第四位
c++代码主体部分
bool check(double avg) { for (int i = 1; i <= n; i++) { sum[i] = sum[i - 1] + cows[i] - avg; } double minv = 0; for (int i = 0, j = m; j <= n; j++, i++) { minv = std::min(minv, sum[i]); if(sum[j] - minv >= 0) return true; } return false; } int main() { scanf("%d %d", &n, &m); double l = 0, r = 0; for (int i = 1; i <= n; i++) { scanf("%d", &cows[i]); r = std::max(r, (double)cows[i]); } while(r - l > 1e-5) { double mid = (l + r) / 2; if(check(mid)) l = mid; else r = mid; } printf("%d\n", (int)(r * 1000)); return 0; }