当前位置: 首页 > news >正文

HDU 4923 Room and Moor(推理+栈维护)

HDU 4924 Room and Moor

题目链接

题意:给定一个01组成的a序列。要求一个b序列,b序列每一个数值为[0, 1]之间的数,而且b序列为非递减序列,要求(aibi)2最小,求这个最小值

思路:推理,非常easy看出,开头一段的0和末尾一段的1等于没有。然后中间每段相似111000这样1在前,0在后的序列。都能够列出一个公式,非常easy推出选择的x为共同的一个值,为1的个数/(1的个数+0的个数)a,那么问题就变成要维护一个递增的x。利用一个栈去做维护,假设遇到一个位置递减了。那么就把它和之前的段进行合并,维护栈中递增,最后把栈中元素都拿出来算一遍就是答案了

代码:

#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;

const int N = 100005;
const double eps = 1e-8;

int t, n, a[N];
struct Seg {
    double one, zero, x;
    Seg() {}
    Seg(double one, double zero, double x) {
    this->one = one;
    this->zero = zero;
    this->x = x;
    }
} s[N];

double cal(double one, double zero) {
    return one / (one + zero);
}

double solve(int n) {
    int sn = 0;
    int one = 0, zero = 0, now = 0;
    while (now < n && !a[now]) {now++;}
    while (n >= 0 && a[n]) n--;
    if (now > n) return 0.0;
    while (now <= n) {
    double one = 0, zero = 0;
    while (a[now]) {
        one += 1;
        now += 1;
    }
    while (now <= n && !a[now]) {
        zero += 1;
        now += 1;
    }
    s[sn].one = one;
    s[sn].zero = zero;
    s[sn++].x = cal(one, zero);
    }
    stack<Seg> st;
    st.push(s[0]);
    for (int i = 1; i < sn; i++) {
    
    Seg now = s[i];

    while (!st.empty() && st.top().x - now.x > -eps) {
        Seg pre = st.top();
        st.pop();
        pre.one += now.one;
        pre.zero += now.zero;
        pre.x = cal(pre.one, pre.zero);
        now = pre;
    }
    st.push(now);

    }
    double ans = 0;
    while (!st.empty()) {
    Seg now = st.top();
    st.pop();
    ans += (1 - now.x) * (1 - now.x) * now.one + now.x * now.x * now.zero;
    }
    return ans;
}

int main() {
    scanf("%d", &t);
    while (t--) {
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    printf("%.6lf\n", solve(n - 1));
    }
    return 0;
}


转载于:https://www.cnblogs.com/llguanli/p/8601766.html

相关文章:

  • linux hosts.equiv设置解析
  • js脚本 将本地图片路径转换为html
  • Python3连接MySQL
  • FineBI学习系列之FineBI的Windows里安装步骤(图文详解)
  • 初次尝试单元测试
  • 突发奇想 应用商店的会员模式
  • Swift 基本数据类型
  • iterator取集合元素
  • 前端ps切图,图文教程,详细。
  • android6.0以上权限动态申请,有视频链接可以看效果。
  • svm资料收集
  • java学习--基础知识第四天--笔记
  • WPF中自定义MarkupExtension
  • 省选专练CQOI2015网络吞吐量
  • 博客作业2---线性表
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 4. 路由到控制器 - Laravel从零开始教程
  • Centos6.8 使用rpm安装mysql5.7
  • HTML5新特性总结
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript新鲜事·第5期
  • JS专题之继承
  • RxJS: 简单入门
  • spring + angular 实现导出excel
  • 创建一种深思熟虑的文化
  • 第十八天-企业应用架构模式-基本模式
  • 回顾 Swift 多平台移植进度 #2
  • 将 Measurements 和 Units 应用到物理学
  • 开源地图数据可视化库——mapnik
  • 前端之Sass/Scss实战笔记
  • 入门到放弃node系列之Hello Word篇
  • 协程
  • 一天一个设计模式之JS实现——适配器模式
  • 云大使推广中的常见热门问题
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • #### go map 底层结构 ####
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (12)Linux 常见的三种进程状态
  • (31)对象的克隆
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (done) 两个矩阵 “相似” 是什么意思?
  • (阿里云万网)-域名注册购买实名流程
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (四)Controller接口控制器详解(三)
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)Java算法:二分查找
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)Sql Server 保留几位小数的两种做法
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET Micro Framework 4.2 beta 源码探析
  • /etc/sudoers (root权限管理)