P2115 [USACO14MAR]破坏Sabotage
对平均值的二分,以及实数域二分,思想很好
#include<bits/stdc++.h> using namespace std; int n; double num[100010],t[100010],ma[100010],mi[100010]; int check(double w) { for(int i=0;i<=n;i++)t[i]=num[i]-w*i; mi[1]=t[1];ma[n-1]=t[n-1]; for(int i=2;i<=n;i++)mi[i]=min(mi[i-1],t[i]); for(int i=n-2;i>=1;i--)ma[i]=max(ma[i+1],t[i]); for(int i=2;i<=n-1;i++)if(ma[i]-mi[i-1]>t[n])return 0; return 1; } int main() { cin>>n; for(int i=1;i<=n;i++)cin>>num[i],num[i]+=num[i-1]; double l=0,r=11000; for(int i=1;i<=50;i++) { double mid=(l+r)/2; if(check(mid)){l=mid;} else r=mid; } printf("%.3lf",l); }