关闭

hdu5753 2016 Multi-University Training Contest 3 Permutation Bo 解题报告

标签: 多校乱搞
608人阅读 评论(0) 收藏 举报
分类:

题意是给你一个长度为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
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

NOIP2016 普及组 解题报告

T1 买铅笔 题目来源:洛谷 1909 思路: 实现一下向上取整的步骤,对三种决策取最小值。 代码: #include #include #include using namesp...
  • yhf_2015
  • yhf_2015
  • 2016-12-04 19:41
  • 1719

NOIP2016提高组复赛 解题报告

Day1T1按照题意模拟就行了,水。 代码:#include #include #include using namespace std; #define N 100005int n,m,d,num...
  • Clove_unique
  • Clove_unique
  • 2016-12-01 21:52
  • 7387

NOIP2016 提高组 解题报告

说明:由于我能力的限制,文章中的做法不一定是最优秀的算法,但官方数据全部测试通过,使用的全部知识全部是NOIP提高组的知识,请组织放心查看。 感谢 GoodQt 的指导与帮助DAY1 T1 玩具谜题...
  • yhf_2015
  • yhf_2015
  • 2016-12-06 21:52
  • 2360

hdu5755 2016 Multi-University Training Contest 3 Gambler Bo 解题报告

这题打的我好伤心............. 题意:给一个N*M的矩阵,矩阵里的元素值为0,1,2中的一个,每次可以选择一个元素(x,y),他的值+2,上下左右四个值+1,矩阵里的元素如果超过2,他...
  • L_0_Forever_LF
  • L_0_Forever_LF
  • 2016-08-31 14:35
  • 329

hdu5754 2016 Multi-University Training Contest 3 Life Winner Bo 解题报告

日常blog恩 题意:Bo 和他的女朋友 G 在一起玩游戏,游戏在一个N*M棋盘上进行,一开始有一个棋子在(1,1),谁先将棋子移到(N,M),谁就胜利,如果无法移到(N,M),则打平。 游戏有四...
  • L_0_Forever_LF
  • L_0_Forever_LF
  • 2016-08-30 14:35
  • 248

hdu5756 2016 Multi-University Training Contest 3 Boss Bo 解题报告

吐槽一下为什么绍兴一中出的题码量这么大 题意: 给你一个n个点,以1为根的树,Q个询问,每次问你如果把若干个点的子树删掉,剩下的点里面,到P点的距离和,距离的最大值或问距离的最小值,如果点删完了,...
  • L_0_Forever_LF
  • L_0_Forever_LF
  • 2016-09-02 17:37
  • 611

【解题报告】2016 Multi-University Training Contest 3

简略的解题报告。
  • TRiddle
  • TRiddle
  • 2016-09-09 12:28
  • 589

hdu 5821 2016 Multi-University Training Contest 8 Ball 解题报告

题意: 给你n个盒子,每个盒子里可能有球或者没有,告诉你球的颜色,没有就是0,m次操作,每次操作可以把一个区间里的球都拿出来,重新放进去,问你m次操作后能不能到达目标状态   每个盒子最多放一个球 ...
  • L_0_Forever_LF
  • L_0_Forever_LF
  • 2016-09-22 22:16
  • 253

2016 Multi-University Training Contest 1----解题报告

2016 Multi-University Training Contest 1----解题报告 1.HDOJ 5726 GCD         比赛做这道题的时候,没有做出来,想到解法写不出来,唉,...
  • gscsdlz
  • gscsdlz
  • 2016-07-20 10:33
  • 625

HDU 5755 Gambler Bo(高斯消元裸题)——2016 Multi-University Training Contest 3

传送门 Gambler BoTime Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other...
  • qingshui23
  • qingshui23
  • 2016-07-27 13:04
  • 1110
    个人资料
    • 访问:118210次
    • 积分:5358
    • 等级:
    • 排名:第5581名
    • 原创:433篇
    • 转载:0篇
    • 译文:0篇
    • 评论:18条