题目大意:

  给出一串序列Ai{0,1},求一个序列Bi[0,1](Bi<Bi+1),使得sigama(Ai-Bi)^2最小

思路:

若B相同,则取A的平均数可使方差最小

若B有序,
     若A==00..011..1序列 则 B最优取法为0序列中取0,1序列中取1,满足B1<B2,最优,B1,B2取值互不影响,不考虑

     若A==11..100..0序列 则 B为其平均数,因为最优是B在1序列中取1,0序列中取0,由于B1<B2,故只有当B1=B2时,可使其最优,解得最小为 1的个数sum/总个数len

因此,可以建立单调栈,栈按sum/len单调递增,若新插入10段的sum/len与栈顶比较,若小于栈顶,则合并,否则入栈

#include <cstdio>
#include <cstring>
#include <stack>
using namespace std; struct Edge{
int sum,len;
}; int a[];
stack<Edge> q;
int main()
{
//freopen("1003.in","r",stdin);
int tt,n;
scanf("%d",&tt);
while(tt--)
{
scanf("%d",&n);
for(int i=; i<=n; i++)
scanf("%d",&a[i]); double ans=;
int l=,r=n;
while(a[l]==) l++;
while(a[n]==) n--;
if(l>n)
{
printf("%.6f",0.0);
continue;
}
r=l-;
while(r<n)
{
int sum=;
while(r+<=n && a[r+]==)
{
sum=sum+;
r++;
}
while(r+<=n && a[r+]==)
r++;
Edge tmp;
tmp.sum=sum;
tmp.len=r-l+;
while(!q.empty() && 1.0*q.top().sum/q.top().len >= 1.0*tmp.sum/tmp.len)
{
tmp.sum+=q.top().sum;
tmp.len+=q.top().len;
q.pop();
}
q.push(tmp);
l=r+;
}
while(!q.empty())
{
int len=q.top().len,sum=q.top().sum;
ans+=(sum*(1.0-1.0*sum/len)*(1.0-1.0*sum/len)+(len-sum)*(1.0*sum/len)*(1.0*sum/len));
q.pop();
}
printf("%.6f\n",ans);
}
return ;
}

最新文章

  1. 4. Java Script 变量(untype)
  2. Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解
  3. 使用oracle存储过程遇到的坑
  4. angularjs + seajs构建Web Form前端(二)
  5. mongodb与mysql命令对比
  6. Oracle 表死锁 解决
  7. Lucene学习笔记: 五,Lucene搜索过程解析
  8. c#导出Excel 使用EXCEL进程
  9. web开发学习之旅---html第二天
  10. UVa 10256 The Great Divide,推断两个凸包是否相离
  11. winzip15.0许可证
  12. XML文档结构
  13. 自己编写JavaScript的sort函数
  14. [Error]Can&#39;t install RMagick 2.13.4. You must have ImageMagick 6.4.9 or later.
  15. 用TCP IP从C#实时传数据到Matlab
  16. Cesium 学习笔记
  17. net_device 内核中是如何组织的
  18. python之if使用方法举例
  19. py库: arrow (时间)
  20. Mybatis逆向工程生成po、mapper接口、mapper.xml

热门文章

  1. oracle——分析函数——排序值分析函数
  2. NS记录
  3. Kafka的消息格式
  4. UNDERSTANDING CALLBACK FUNCTIONS IN JAVASCRIPT
  5. POJ 1733 Parity game(离散化+带权并查集)
  6. POJ 1716
  7. java基础知识回顾之---java String final类普通方法的应用之“子串在整串中出现的次数”
  8. 使用getScript()方法异步加载并执行js文件
  9. 使用CXF与Spring集成实现RESTFul WebService
  10. 【Linux常识篇(1)】所谓的正向代理与反向代理