HEOI2015小L的白日梦
题面链接
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的白日梦的更多相关文章
- 【BZOJ4030】[HEOI2015]小L的白日梦
		
[BZOJ4030][HEOI2015]小L的白日梦 题面 BZOJ 洛谷 题解 要求的是最小的不开心连续段的期望. 然后发现自己就不会做了. 然后就可以来抄题解啦. 首先来猜性质: 第一个,一定是按 ...
 - BZOJ 4030: [HEOI2015]小L的白日梦
		
4030: [HEOI2015]小L的白日梦 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 172 Solved: 39[Submit][Statu ...
 - P4110 [HEOI2015]小L的白日梦
		
传送门 题解 //minamoto #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef l ...
 - bzoj4030【HEOI2015】小L的白日梦
		
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4030 sol :orz Yousiki http://www.cnblogs.com/you ...
 - 洛谷U4727小L的二叉树[树转序列 LIS]
		
题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...
 - ACM  D的小L
		
D的小L 时间限制:4000 ms | 内存限制:65535 KB 难度:2 描述 一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...
 - bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp
		
4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 98 Solved: 29[Submit][Status] ...
 - nyoj-366-D的小L(求全排列)
		
D的小L 时间限制:4000 ms | 内存限制:65535 KB 难度:2 描述 一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡 ...
 - 洛谷U4727 小L 的二叉树
		
U4727 小L 的二叉树 题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树 ...
 
随机推荐
- 零基础学python之构建web应用(入门级)
			
构建一个web应用 前面的学习回顾: IDLE是Python内置的IDE,用来试验和执行Python代码,可以是单语句代码段,也可以是文本编辑器中的多语句程序. 四个内置数据结构:列表.字典.集合和元 ...
 - Python序列之列表  (list)
			
作者博文地址:http://www.cnblogs.com/spiritman/ 列表是Python中最基本的数据结构,是Python最常用的数据类型.Python列表是任意对象的有序集合,通过索引访 ...
 - 【探路者】Postmortem会议(“事后诸葛亮”会议)
			
[探路者]Postmortem会议(“事后诸葛亮”会议) 整理:米赫 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的贪吃蛇游戏主要将完成一个 ...
 - Sprint会议2
			
昨天:准备查找安卓APP开发的有关资料,安装有关软件 今天:自己制作一个安卓小程序,熟悉一下操作 遇到问题:安装遇到问题,环境配置出现问题
 - 第一阶段Spring个人总结
			
通过这一阶段的冲刺,我感到的是名义上的团队,而实际上却是一个人的事,每个人跟每个人都不一样,都有自己的特点,总会出些不必要的麻烦. 还有团队的进展也是看不到什么东西,说实话,这次我并没有太多关注团队的 ...
 - Good Time 冲刺 六
			
一.今日完成任务情况 第六天 日期:2018.6.19 王怡镔:今天完善了页面,对部分不足进行改进. 于鑫宇:对界面进行完善. 胡雅馨:今天完成前端页面,并改善后端,完善项目. 黄 鹤:做完最后的打卡 ...
 - oh my god 四则运算
			
Week1地址:https://git.coding.net/leiqh549/four.git 需求分析: 1.一个生成n道四则运算的程序,要求数字在0-100间,运算符在3-5个之间且运算符至少包 ...
 - AVMoviePlayer 视频播放器
			
AVMoviePlayer 是使用系统框架 MPMoviePlayerController 封装的视频播放器 一.功能: 1.根据手机旋转自由切换横竖屏:2.手势轻点显示/隐藏topView/bott ...
 - grunt入门讲解6:grunt使用步骤和总结
			
Grunt是啥? 很火的前端自动化小工具,基于任务的命令行构建工具. Grunt能帮我们干啥? 假设有这样一个场景: 编码完成后,你需要做以下工作 HTML去掉注析.换行符 - HtmlMin CSS ...
 - Redis内存回收:LRU算法
			
Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read Redis中采用两种算法进行内存回收,引用计数算法以及LRU ...