当前位置:   article > 正文

poj 2018 Best Cow Fences 二分查找dp_best cow fences题解

best cow fences题解

 惭愧 参考bloghttp://www.cppblog.com/varg-vikernes/archive/2010/03/02/108737.aspx

 

  1. #include<iostream>
  2. using namespace std;
  3. #define doit(n) for(int i=1;i<=n;i++)
  4. double a[100005],sum[100005];
  5. int n,m;
  6. double r,l;
  7. bool chack(double val)
  8. {
  9. double temp;
  10. double pre=(sum[m-1])-(m-1)*val;//这里默认其实位置为1
  11. for(int i=m;i<=n;i++)
  12. {
  13. temp=(sum[i]-sum[i-m])-m*val; // 计算长度为m的和
  14. pre+=(a[i]-val); //一段一段的往上加
  15. pre=max(temp,pre); //这里用来更新起始位置
  16. if(pre>-1e-6) //注意这里为负值 0的时候也想左翼
  17. return 1;
  18. }
  19. return 0;
  20. }
  21. int main()
  22. {
  23. while(scanf("%d%d",&n,&m)!=EOF)
  24. {
  25. r=0;l=0x7FFFFFFF;
  26. memset(sum,0,sizeof(sum));
  27. doit(n)
  28. {
  29. scanf("%lf",&a[i]);
  30. sum[i]=sum[i-1]+a[i];
  31. l=min(a[i],l);
  32. r=max(a[i],r);
  33. }
  34. while(r-l>1e-6)
  35. {
  36. double mid=(r+l)/2;
  37. if(chack(mid))
  38. {
  39. l=mid;
  40. }
  41. else
  42. r=mid;
  43. }
  44. printf("%d\n",(int)(r*1000)); //这里选值必须选右面,要是选左面强制转换的时候会少一也就是说有可能6499
  45. }
  46. return 0;
  47. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/561253
推荐阅读
相关标签
  

闽ICP备14008679号