profit
Portal --> broken qwq
Description
大M成立的怪兽电力公司最近刚建立了一个网站。这个季度共有\(n\)天,第\(i\)天共有\(v[i]\)个用户点击该网站,总的广告价值为\(c[i]\)。 然而大M并不知道该如何计算收入。他定义某一天的收入\((p[i]=min(100*max(v[i..j]),min(c[i..j]))(j>=i)\)。也许\(j\)不同会导致\(p[i]\)不同,大M会选择一个\(j\)使得\(p[i]\)最大。
大M并不知道该如何算这个季度的每天平均收入。他会随机在\(n\)天中选择\(k\)天\(i_1,i_2...i_k\),则这个季度的每天平均收入就定为\(min(p[i_1],p[i_2]...p[i_k])\)。 你作为他的会计对于他这种计算方法十分不放心。你想要知道在大M的计算下,这个季度的每天平均收入的期望值。
数据范围:对于100%的数据,\(n<=300000,k<=n,v[i]<=10^7,c[i]<=10^9\)
Solution
首先我们假设我们已经求出了\(p\),那么接下来的答案要怎么算?
看到这种最大最小值贡献类的题目。。感觉都有一个比较好的方向就是可以从某一个数作为最值然后反过来计算其贡献
比如说在这题里面就是,考虑每一个\(p[i]\)会在多少中选择中有贡献,具体一点就是我们考虑将\(p\)按照从小到大的顺序排列,然后依次从左往右考虑每一个\(p[i]\)的贡献
对于第\(i\)个位置的\(p\)值,因为这个位置要作为最小值才能有贡献,所以\(i\)前面的数全部都不能选,所以也就是\(\binom {n-i} {k-1}\)种组合(第\(i\)这个位置的数确定要选,然后剩下的\(k-1\)个数只能在后面的\(n-i\)个数里面选),算概率的话就是除以一个总的方案数也就是\(\binom n k\)即可
那么现在的问题是,直接求组合数是不行的(没有模数)
注意到每一个位置乘的系数那个组合数都是\(\binom x {k-1}/\binom n k\)的形式,然后当\(x=n-1\)的时候这个式子是\(=k/n\)的,然后我们发现对于不同的\(i\),在改变的只有\(x\),那我们把这个式子用阶乘的形式写开就发现它可以非常愉快地一路递推回去了(每次\(*(n-i-k+1)/(n-i)\)就可以了)
然后现在的问题就只剩下怎么求\(p\)了
我们观察一下\(p[i]\)的表达式,前半部分是取\(max\)(不递减),后半部分是取\(min\)(不递增),总的又是取\(min\),稍微画一下函数图像之类的就可以发现能更新当前位置的方案一定是前面的\(p\)值或者令题目中的那个\(j\)等于当前位置时候表达式的取值
所以我们可以直接\(O(n)\)dp一下得到\(p\)
然后这题就做完啦ovo
代码大概长这个样子
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=300010;
int v[N],c[N],p[N];
long double ans,C;
int n,k;
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d%d",&n,&k);
for (int i=1;i<=n;++i) scanf("%d",v+i);
for (int i=1;i<=n;++i) scanf("%d",c+i);
p[n]=min(v[n]*100,c[n]);
for (int i=n-1;i>=1;--i){
p[i]=max(p[i+1],100*v[i]);
p[i]=min(p[i],c[i]);
}
sort(p+1,p+1+n);
ans=0; C=(1.0*k)/(1.0*n);
for (int i=1;n-i>=k-1;++i){
ans+=1.0*p[i]*C;
C*=(1.0*n-i-k+1)/(1.0*n-i);
}
printf("%.10Lf\n",ans);
}
/*
input
3 2
3 2 1
300 200 300
output
133.333333
*/
profit的更多相关文章
- 【HDU 5855】Less Time, More profit(网络流、最小割、最大权闭合子图)
Less Time, More profit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...
- HDU5855 Less Time, More profit(最大权闭合子图)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5855 Description The city planners plan to build ...
- (转) Reinforcement Learning for Profit
Reinforcement Learning for Profit July 17, 2016 Is RL being used in revenue generating systems today ...
- UVA 10581 - Partitioning for fun and profit(数论递推)
10581 - Partitioning for fun and profit 题目链接 题意:给定m, n,表示分配给n个格子,分配m个数字进去,每一个格子最少1,而且序列要是递增的,问第k个字典序 ...
- uva 10581 - Partitioning for fun and profit(记忆化搜索+数论)
题目链接:uva 10581 - Partitioning for fun and profit 题目大意:给定m,n,k,将m分解成n份,然后依照每份的个数排定字典序,而且划分时要求ai−1≤ai, ...
- hdu_5585_Less Time, More profit(二分+最大权闭合图)
题目链接:hdu_5585_Less Time, More profit 题意: 有n个工厂,每建一个工厂要花费vi,需要时间ti,然后有m个商店,每个商店需要在指定的k个工厂中进货,才能盈利,如果其 ...
- [Educational Round 59][Codeforces 1107G. Vasya and Maximum Profit]
咸鱼了好久...出来冒个泡_(:з」∠)_ 题目连接:1107G - Vasya and Maximum Profit 题目大意:给出\(n,a\)以及长度为\(n\)的数组\(c_i\)和长度为\( ...
- [Swift]LeetCode826. 安排工作以达到最大收益 | Most Profit Assigning Work
We have jobs: difficulty[i] is the difficulty of the ith job, and profit[i] is the profit of the ith ...
- [LeetCode] Most Profit Assigning Work 安排最大利润的工作
We have jobs: difficulty[i] is the difficulty of the ith job, and profit[i] is the profit of the ith ...
- Maximum profit of stocks
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
随机推荐
- Git生成SSH密钥
git config --global user.name "yangjianliang"配置用户名 git config --global user.email "52 ...
- Python解包参数列表及 Lambda 表达式
解包参数列表 当参数已经在python列表或元组中但需要为需要单独位置参数的函数调用解包时,会发生相反的情况.例如,内置的 range() 函数需要单独的 start 和 stop 参数.如果它们不能 ...
- hive的内置函数和自定义函数
一.内置函数 1.一般常用函数 .取整函数 round() 当传入第二个参数则为精度 bround() 银行家舍入法:为5时,前一位为偶则舍,奇则进. .向下取整 floor() .向上取整 ceil ...
- Python 3 利用 Dlib 实现摄像头人脸检测特征点标定
0. 引言 利用 Python 开发,借助 Dlib 库捕获摄像头中的人脸,进行实时人脸 68 个特征点标定: 支持多张人脸: 有截图功能: 图 1 工程效果示例( gif ) 图 2 工程效果示例( ...
- 01_基于TCP的循环为同一个客户端下载文件的下载器
原版: TCP分为客户端(client)和服务器(server),每次服务器只能为客户端提供一次的下载服务. 改良版: TCP分为客户端(client)和服务器(server), (1)每次服务器能为 ...
- 初试Gevent – 高性能的Python并发框架
Gevent是一个基于greenlet的Python的并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效. 于greenlet.eventlet相比,性能 ...
- Linux下使用vim编辑C程序
这几天在系统能力班自学linux,加上最近大数据课上开始使用linux,我在这里总结一下,linux下使用vim编辑c程序的一些问题. 大数据课上是直接使用micro来编辑的,我这里只是简单的说明一下 ...
- Java中的Object类的toString()方法,equals()方法
Object类是所有类的父类,若没有明确使用extends关键字明确表示该类继承哪个类,那么它就默认继承Object类,也就可以使用Object中的方法: 1.toString 如果输出一个对象的时候 ...
- flask验证登录学习过程(1)---实践flask_jwt
flask_jwt应用代码: from flask import Flask from flask_jwt import JWT,jwt_required,current_identity from ...
- Java微笔记(7)
String 类常用方法 注意点: 字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1 使用 indexOf 进行字符或字符串查找时,如果匹配返回位置索引:如果没有匹配 ...