题面链接

洛咕

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. node安装和npm全局配置

    本文章环境 windows10 64位家庭版 Node10.15.3LTS 安装包下载 Node官网 安装node 点击安装文件, 一键安装, 注意安装位置和添加到环境变量(xx to PATH)选项 ...

  2. Table 组件构建过程中遇到的问题与解决思路

    在 GearCase 开源项目构建 Table 组件的过程中.遇到了各式各样的问题,最后尝试了各种方法去解决这些问题. 遇到的部分问题 checkbox 的全选和半选问题 table 组件的排序请求方 ...

  3. Netty源码分析第2章(NioEventLoop)---->第5节: 优化selector

    Netty源码分析第二章: NioEventLoop   第五节: 优化selector 在剖析selector轮询之前, 我们先讲解一下selector的创建过程 回顾之前的小节, 在创建NioEv ...

  4. JAVA之访问控制符

    1.访问修饰符 public:该类和非该类的均能访问 protect:该类和该类的子类,同一个包内的成员也能访问 默认:同一个包内的类可以访问 private:只有该类可以访问 特性:在继承的关系中, ...

  5. ipcs命令详解

    基础命令学习目录首页 多进程间通信常用的技术手段包括共享内存.消息队列.信号量等等,Linux系统下自带的ipcs命令是一个极好的工具,可以帮助我们查看当前系统下以上三项的使用情况,从而利于定位多进程 ...

  6. Python发送邮件(最全)

    简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件. Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听 ...

  7. 3.控制hive map reduce个数

    参考: https://blog.csdn.net/wuliusir/article/details/45010129 https://blog.csdn.net/zhong_han_jun/arti ...

  8. spring冲刺计划

    会议召开时间表 日期 时间 内容 05/09 21:00-22:00 讨论题目(未果) 05/10 21:00-21:30 确定题目(网络助手) 05/13 21:00-21:45 讨论软件页面设计 ...

  9. 团队项目--NABCD模型

    蹭课神器 N(need需求) 每个人的兴趣都不一样,或许你很喜欢自己的专业,并且想再进一步学习专业知识:或许你不是太喜欢自己的专业,想上一些自己感兴趣的课程:但是,当你想上你所钟 意的课时,却发现自己 ...

  10. 课堂练习 psp表

    项目计划总结表: 日期 编程 完善程序 测试程序 参考资料 日总结 3.20 18:00---19:30       1.5 3.21   9:30----10:00 10:00---10:30   ...