hdu5753 2016 Multi-University Training Contest 3 Permutation Bo 解题报告
来源:互联网 发布:霍华德新秀赛季数据 编辑:程序博客网 时间:2024/06/06 01:46
题意是给你一个长度为n的序列c,然后h序列的1~n是1-n的一个排列,h[0] = h[n+1] = 0 , 定义 f( h ) = Σ c[i] ( h[i]>h[i-1] && h[i] > h[i+1] ) , 然后求这个 f( h ) 的期望
好像正解是说什么概率DP,两边的有1/2的概率,中间的1/3,反正我是不知道为什么。。。。。
我的做法比较奇怪,看不懂的去看下别人的博客吧
个人做法的话,首先可以想到两边的c能被取到的概率都是一样的,中间的也都是一样的,所以先特判n=1,2的情况,其他情况只对第1,2个位置处理:
枚举第1,2个位置全排列时放的数字为a,b(a ≠ b),
如果a>b,那么第一个位置就多 (n-2)! 种情况使得第一个位置取到值 ( 前2个位置这么放,后面有(n-2)!种放法 )
如果a<b,那么第三个位置有 b-2 种放法使得第二个位置取到值,对答案贡献(b-2)*(n-3)!
因为阶乘非常大,所以计算放法数时不计算在内,只计算的放法数除以阶乘的值(也就是每次满足条件时分别加的是1, b-2 ),输出时这个阶乘可以分别和分母 n!(求期望) 约掉
所以两边的答案最后是(c[1]+c[n])*之前计算的值/(n-1)/n , 中间的答案是中间值的和*之前计算的值 / (n-2) / (n-1) / n,最后再加起来输出就好了
另外要再注意一下有些地方是爆int的
code:
#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<ctime>#include<cmath>#include<string>#include<bitset>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>using namespace std;const int maxn = 1100;int c[maxn],n;int main(){while( scanf("%d",&n) != EOF ){for( int i=1;i<=n;i++ ) scanf("%d",&c[i]);if( n == 1 ){printf("%lf\n",double(c[1]));continue;}if( n == 2 ){printf("%lf\n",double(c[1]+c[2])/2);continue;}int s1,s2;double ret1,ret2;ret1 = ret2 = 0.0; s1 = s2 = 0;for( int i=1;i<=n;i++ ){for( int j=1;j<=n;j++ )if( i != j ){if( i > j ) s1 ++;if( i < j ) s2 += j-2;}}ret1 = double(s1)*double( c[1]+c[n] );for( int i=2;i<n;i++ ) ret2 += double(s2)*double(c[i]);double r1 = ret1/n/(n-1) ,r2 = ret2/n/(n-1)/(n-2);printf("%lf\n",r1+r2);}return 0;}
0 0
- hdu5753 2016 Multi-University Training Contest 3 Permutation Bo 解题报告
- 2016 Multi-University Training Contest 3 1002 Permutation Bo
- hdu5752 2016 Multi-University Training Contest 3 Sqrt Bo 解题报告
- hdu5754 2016 Multi-University Training Contest 3 Life Winner Bo 解题报告
- hdu5755 2016 Multi-University Training Contest 3 Gambler Bo 解题报告
- hdu5756 2016 Multi-University Training Contest 3 Boss Bo 解题报告
- hdu5758 2016 Multi-University Training Contest 3 Explorer Bo 解题报告
- hdu 5759 2016 Multi-University Training Contest 3 Gardener Bo 解题报告
- 2016 Multi-University Training Contest 3----解题报告
- 2016 Multi-University Training Contest 3 解题报告
- 【解题报告】2016 Multi-University Training Contest 3
- 2016 Multi-University Training Contest 3 hdu 5753 Permutation Bo【打表+递推】
- hdu 5753 Permutation Bo(2016 Multi-University Training Contest 3——组合)
- (HDU 5753)2016 Multi-University Training Contest 3 Permutation Bo (水)
- 2014 Multi-University Training Contest 解题报告
- 2016 Multi-University Training Contest 1----解题报告
- 2016 Multi-University Training Contest 2----解题报告
- 2016 Multi-University Training Contest 4 解题报告
- 浏览器内核
- JDK的命令行工具和可视化工具学习笔记
- 实现strchr的功能
- JAVA_OA(十四):SSM练手项目bug-JSP页面传递参数的编码问题
- 第三个年头
- hdu5753 2016 Multi-University Training Contest 3 Permutation Bo 解题报告
- Java集合之Collection接口
- RESTful
- Javascript 严格模式use strict详解
- VS2010如何调试IIS上的网站
- 堆排序的Java实现
- 2016web前端与移动开发就业班全套
- c++变量初始化规则
- zabbix学习笔记——环境搭建