POJ 2018实数二分精度问题(注意double转int的精度问题,所以是答案取r)


 1 #include
 2 #include
 3 #include
 4 using namespace std;
 5 const int N=1e5+5;
 6 int n,t;
 7 double a[N],b[N],sum[N];
 8 
 9 int main()
10 {
11     scanf("%d%d",&n,&t);
12     for(int i=1;i<=n;i++)scanf("%lf",&a[i]);
13     double l=0,r=1e6,eps=1e-5;
14     while(r-l>eps)
15     {
16         double mid=(l+r)/2;
17         for(int i=1;i<=n;i++)
18         {
19             b[i]=a[i]-mid;
20             sum[i]=sum[i-1]+b[i];
21         }
22         double mi=1e10,ans=-1e10;
23         for(int i=t;i<=n;i++)
24         {
25             mi=min(mi,sum[i-t]);
26             ans=max(ans,sum[i]-mi);
27         }
28         if(ans>=0)l=mid;
29         else r=mid;
30     }
31     cout<<int(r*1000)<<endl;
32 }

相关