题面链接

洛咕

sol

为什么网上面只有神仙题解啊!!!

引起我这种蒟蒻不适QAQ。

性质证明留给巨佬

然后我只贴性质了QwQ。

1.一定存在最优解每一天不高兴的概率是单调不增的。

2.一定存在最优解它选取的项目是所有项目按照不高兴的概率排序后的前缀一段加上后缀一段。

3.每一次选取的项目种类只有三种可能的情况:选了1个,全部选完,其他。且处于第三种状态的至多一个。

认认真真蒯写的代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define gt getchar()
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
inline int in()
{
int k=0;char ch=gt;
while(ch<'-')ch=gt;
while(ch>'-')k=k*10+ch-'0',ch=gt;
return k;
}
struct node
{
long double val;
int cnt;
node(){}
node(long double _val,int _cnt):val(_val),cnt(_cnt){}
inline void read()
{
int a,b;
scanf("%d/%d",&a,&b);
val=(long double)a/b;
scanf("%d",&cnt);
}
inline bool operator<(const node &a)const{return val>a.val;}
}A[150005],B[350005];
int n,m;
long double calc()
{
//注意前缀后缀两次的意义是不一样的!
long double ret=1e18,sum=0;
ll now=1,res=m;
for(int i=n;i;--i)
sum+=(B[i].cnt-1)*B[i].val*(1-B[i].val)+(1-B[i].val)*B[i+1].val,res-=B[i].cnt;
//我们可以枚举前缀的位置,后缀端点是单调的,这里强制了前缀末端只剩一,其它在后缀
for(int i=1;i<=n;++i)
{
res-=B[i].cnt;
while(now<=n&&res<=0)
sum-=(B[now].cnt-1)*B[now].val*(1-B[now].val)+(1-B[now].val)*B[now+1].val,res+=B[now++].cnt;
if(res<=0)break;
sum+=(B[i].cnt-1)*B[i].val*(1-B[i].val)+
(1-B[i-1].val)*B[i].val;
ret=std::min(ret,sum+
(res-1)*B[now-1].val*(1-B[now-1].val)+
(1-B[now-1].val)*B[now].val+
(1-B[i].val)*B[now-1].val);
}
res=m,sum=0;
//求只有前缀的方案
for(int i=1;i<=n;++i)
{
int mn=std::min(res,(ll)B[i].cnt);
if(!mn)break;
else res-=mn,sum+=(mn-1)*B[i].val*(1-B[i].val)+(1-B[i-1].val)*B[i].val;
}
return std::min(ret,sum);
}
int main()
{
int t=in();
while(t--)
{
n=in(),m=in();int tot=0;
for(int i=1;i<=n;++i)
{
A[i].read();
if(!A[i].cnt)--i,--n;
}
std::sort(A+1,A+n+1);
for(int i=1;i<=n;++i)
{
B[++tot]=node(A[i].val,1);
if(--A[i].cnt)
{
if(A[i].cnt>1)
B[++tot]=node(A[i].val,A[i].cnt-1);
B[++tot]=node(A[i].val,1);
}
}
B[0].val=1,B[(n=tot)+1].val=0;
long double ans=calc();
//B[i].val=1-B[i].val是说你把前缀后缀倒过来做
//本来应该是 (1-a0)a1+(1-a1)a2...(1-an-1)an
//然后变成了 an(1-an-1)...a2(1-a1)+a1(1-a0)
//所以要变成 1-B[i].val
for(int i=1;i<=n;++i)B[i].val=1-B[i].val;
std::reverse(B+1,B+n+1);
ans=std::min(ans,calc());
printf("%.6lf\n",(double)fabs(ans));
}
return 0;
}

HEOI2015小L的白日梦的更多相关文章

  1. 【BZOJ4030】[HEOI2015]小L的白日梦

    [BZOJ4030][HEOI2015]小L的白日梦 题面 BZOJ 洛谷 题解 要求的是最小的不开心连续段的期望. 然后发现自己就不会做了. 然后就可以来抄题解啦. 首先来猜性质: 第一个,一定是按 ...

  2. BZOJ 4030: [HEOI2015]小L的白日梦

    4030: [HEOI2015]小L的白日梦 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 172  Solved: 39[Submit][Statu ...

  3. P4110 [HEOI2015]小L的白日梦

    传送门 题解 //minamoto #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef l ...

  4. bzoj4030【HEOI2015】小L的白日梦

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4030 sol  :orz Yousiki http://www.cnblogs.com/you ...

  5. 洛谷U4727小L的二叉树[树转序列 LIS]

    题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...

  6. ACM D的小L

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2   描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...

  7. bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 98  Solved: 29[Submit][Status] ...

  8. nyoj-366-D的小L(求全排列)

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2 描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡 ...

  9. 洛谷U4727 小L 的二叉树

    U4727 小L 的二叉树 题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树 ...

随机推荐

  1. 【转】新装的CentOS 7安装python3

    https://blog.csdn.net/lovefengruoqing/article/details/79284573 centos7 自带有 python,但是却是 python2 版本的 p ...

  2. PSO算法的改进(参数)

    ## 基本PSO的改进 虽然粒子群在求解优化函数时,表现了较好的寻优能力:通过迭代寻优计算,能够迅速找到近似解:但基本的PSO容易陷入局部最优,导致结果误差较大. 两个方面:1.将各种先进理论引入到P ...

  3. Swing的概述

    Swing在Java中是一个包,下面就是它的基本概述:简介: Java为了方便图形界面的实现, 专门设计了类库来满足各种各样的图形元素和用户交互事件, 该类库即为抽象窗口工具箱(Abstract Wi ...

  4. 第七章 用户输入和while循环

    7.1函数input()的工作原理 函数默认输入为字符串string,如果需使用数字,需用int进行类型转换 7.2 while循环 while是根据条件的真假判断是否进入执行 使用标志: 使用bre ...

  5. Doing Homework again:贪心+结构体sort

    Doing Homework again Problem Description Ignatius has just come back school from the 30th ACM/ICPC. ...

  6. C++STL 中的容器整体/逐元素操作方法 少写80%for循环

    本文中示例代码默认已引用 std 命名空间 累加 (std::accumulate) accumulate(begin, end, init, op) 返回给定区间内元素的累加值与给定初值的和,初值不 ...

  7. awk之close函数

    echo "21 2 " | awk '{ first[NR]=$ second[NR]=$ }END{ print "======打印第1列并排序:========== ...

  8. [持久更新] 剑指offer题目Python做题记录

    第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...

  9. 富文本(wangEditor框架)的使用教程

    富文本的使用教程(wangEditor框架) 一,相信很多人用过很多富文本的框架,现在我向大家推荐一个很实用的一个富文本框架,具有丰富的功能项,容易使用. 所以本博客介绍这个富文本编辑器的使用哈!觉得 ...

  10. userdel命令详解

    基础命令学习目录首页 原文链接:http://www.360doc.com/content/15/0814/14/2149364_491595091.shtml 命 令: userdel  功能说明: ...