题意:有$n$个人,对每个人,他有$p_i$的概率饥饿值为$x_i$($1\leq i\leq m$),你现在要做$n$盘寿司,每盘寿司有一定的数量,当这$n$个人的饥饿值确定后他们会自己选择最优的(人,寿司)配对方案使得$C=\sum\limits_{i=1}^n\left\lvert h_i-c_i\right\rvert$最小(设第$i$个人饥饿值为$h_i$,吃的寿司数量为$c_i$),现在要合适地选择$c_{1\cdots n}$使得$C$的期望最小,输出这个最小的期望

首先,如果确定了$h_{1\cdots n},c_{1\cdots n}$,那么将它们都排序就可以得到最小的$C$,因为如果先把$h$从小到大排序,并且存在$c_i\gt c_j$,那么交换$c_i,c_j$不会让$C$变大

那么我们要最小化$\sum\limits_{i=1}^n\sum\limits_{j=1}^mt_{i,j}\left\lvert c_i-x_j\right\rvert$,其中$t_{i,j}$为这些随机变量中第$i$小的数是$x_j$的概率

设$u_{i,j}$为第$i$小的数$\leq x_j$的概率,那么$t_{i,j}=u_{i,j}-u_{i,j-1}$,我们要算$u$

设$s$为$p$的前缀和,因为恰有$k$个数$\leq x_j$的概率为$\binom nks_j^k(1-s_j)^{n-k}$,所以$u_{i,j}=\sum\limits_{k=i}^n\binom nks_j^k(1-s_j)^{n-k}$

最后的问题是要确定$c_i$使得$\sum\limits_{i=1}^n\sum\limits_{j=1}^mt_{i,j}\left\lvert c_i-x_j\right\rvert$最小,对每个$i$分开考虑,就是求一条折线上的最小值,而折线上的最小值只能在端点处取到,所以扫一遍即可

#include<stdio.h>
typedef long double du;
const du inf=9223372036854775807.;
void fmin(du&a,du b){
	if(b<a)a=b;
}
du pow(du a,int b){
	du s=1;
	for(;b;b>>=1){
		if(b&1)s*=a;
		a*=a;
	}
	return s;
}
int x[2010],m;
du s[2010],c[2010][2010],t[2010][2010],st[2010];
du solve(du*t){
	int i;
	du res;
	for(i=1;i<=m;i++){
		st[i]=st[i-1]+t[i];
		s[i]=s[i-1]+t[i]*x[i];
	}
	res=inf;
	for(i=1;i<=m;i++)fmin(res,st[i]*x[i]-s[i]+s[m]-s[i]-(st[m]-st[i])*x[i]);
	return res;
}
int main(){
	int n,Q,i,j;
	du res;
	scanf("%d%d%d",&n,&m,&Q);
	for(i=1;i<=m;i++){
		scanf("%d%d",x+i,&j);
		s[i]=s[i-1]+j/(du)Q;
	}
	c[0][0]=1;
	for(i=1;i<=n;i++){
		c[i][0]=1;
		for(j=1;j<=i;j++)c[i][j]=c[i-1][j-1]+c[i-1][j];
	}
	for(i=n;i>0;i--){
		for(j=1;j<=m;j++)t[i][j]=t[i+1][j]+c[n][i]*pow(s[j],i)*pow(1-s[j],n-i);
	}
	res=0;
	for(i=1;i<=n;i++){
		for(j=m;j>0;j--)t[i][j]-=t[i][j-1];
		res+=solve(t[i]);
	}
	printf("%.8lf",(double)res);
}

[CODE FESTIVAL 2018]Sushi Restaurant的更多相关文章

  1. Codeforces Avito Code Challenge 2018 D. Bookshelves

    Codeforces Avito Code Challenge 2018 D. Bookshelves 题目连接: http://codeforces.com/contest/981/problem/ ...

  2. CODE FESTIVAL 2015 決勝(部分)

    CODE FESTIVAL 2015 決勝(部分) B - ダイスゲーム 题意: 给\(N\)个\(6\)个面骰子,然后问掷到概率最大的点数是多少. 分析: 随便打表随便发现是\(\huge\left ...

  3. 【赛时总结】 ◇赛时·IV◇ CODE FESTIVAL 2017 Final

    ◇赛时-IV◇ CODE FESTIVAL 2017 Final □唠叨□ ①--浓浓的 Festival 气氛 ②看到这个比赛比较特别,我就看了一看--看到粉粉的界面突然开心,所以就做了一下 `(* ...

  4. 【AtCoder】CODE FESTIVAL 2016 qual A

    CODE FESTIVAL 2016 qual A A - CODEFESTIVAL 2016 -- #include <bits/stdc++.h> #define fi first # ...

  5. 【AtCoder】CODE FESTIVAL 2016 qual B

    CODE FESTIVAL 2016 qual B A - Signboard -- #include <bits/stdc++.h> #define fi first #define s ...

  6. 【AtCoder】CODE FESTIVAL 2016 qual C

    CODE FESTIVAL 2016 qual C A - CF -- #include <bits/stdc++.h> #define fi first #define se secon ...

  7. CODE FESTIVAL 2017 qual B B - Problem Set【水题,stl map】

    CODE FESTIVAL 2017 qual B B - Problem Set 确实水题,但当时没想到map,用sort后逐个比较解决的,感觉麻烦些,虽然效率高很多.map确实好写点. 用map: ...

  8. CODE FESTIVAL 2017 qual B C - 3 Steps【二分图】

    CODE FESTIVAL 2017 qual B C - 3 Steps 题意:给定一个n个结点m条边的无向图,若两点间走三步可以到,那么两点间可以直接连一条边,已经有边的不能连,问一共最多能连多少 ...

  9. [AtCoder Code Festival 2017 QualB D/At3575] 101 to 010 - dp

    [Atcoder Code Festival 2017 QualB/At3575] 101 to 010 有一个01序列,每次可以选出一个101,使其变成010,问最优策略下能操作几次? 考虑像 11 ...

随机推荐

  1. 【CodeForces】899 E. Segments Removal

    [题目]E. Segments Removal [题意]给定n个数字,每次操作删除最长的连续相同数字(等长删最左),求全部删完的最少次数.n<=2*10^6,1<=ai<=10^9. ...

  2. 源自人脑的神奇算法 -- 读《How to make your own neural network》有感

    最近读到了一本很好的关于机器学习-深度学习的书值得推荐下并特意做了这个学习总结. 为什么推荐 在我认为好书(计算机类)的评判有几个标准: 试图以通俗的语言阐述,并在引入任何新概念的时候都讲述来龙去脉, ...

  3. 【洛谷 P3191】 [HNOI2007]紧急疏散EVACUATE(二分答案,最大流)

    题目链接 sb错误调了3hour+.. bfs预处理出每个\(.\)到每个\(D\)的最短距离. 二分时间\(t\),把每个\(D\)拆成\(t\)个点,这\(t\)个点两两连边,流量\(INF\)表 ...

  4. Vue笔记之props验证

    使用props 在Vue中父组件向子组件中传送数据是通过props实现的,一个简单的使用props的例子: <!DOCTYPE html> <html> <head> ...

  5. C# 操作资源文件

    (1)首先引用这两个命名空间 (2)两种方式调用资源文件中的内容 private void button2_Click(object sender, EventArgs e) { //通过Resour ...

  6. 网络抓包wireshark(转)

    下载地址:https://www.wireshark.org/download/win64/   抓包应该是每个技术人员掌握的基础知识,无论是技术支持运维人员或者是研发,多少都会遇到要抓包的情况,用过 ...

  7. 关于parse_str变量覆盖分析

    这个漏洞有两个姿势.一个是不存在的时候一个是存在的时候. 经过测试该漏洞只在php5.2中存在,其余均不存在. 倘若在parse_str函数使用的代码上方未将其定义那么即存在变量覆盖漏洞否则不行. 还 ...

  8. Thinkphp的自定义路由(route.php)

    废话:因为thinkphp的默认路由会导致URL特别长,从而会影响搜索引擎优化.所以就衍生了自定义路由,尽量将URL缩短. 这是默认的路由文件: <?php return [ '__patter ...

  9. docker之构建redis-cluster集群

    下载和编译redis安装包 参考:https://www.cnblogs.com/cwp-bg/p/8094914.html # 从官方网站下载安装包,注意,当前在哪个目录下执行命令,下载的包将在哪个 ...

  10. UNIX环境高级编程学习笔记(十)为何 fork 函数会有两个不同的返回值【转】

    转自:http://blog.csdn.net/fool_duck/article/details/46917377 以下是基于 linux 0.11 内核的说明. 在init/main.c第138行 ...