localmaxima(原题为权限题)
Description
给出一个排列,若其中一个数比它前面的数都大,则称为localmaxima数,求一个随机排列中localmaxima数的个数的期望
Input
一个数n,表示排列为1-n的一个随机排列。
Output
一个浮点数表示localmaxima数的个数期望。四舍五入保留8位小数。
Attention
对30%数据n<=10.
对80%数据n<=1000000.
对100%数据n<=2^31-1
Hint
这肯定是道数学题了
期望的拆分
首先回顾期望的求法:
离散型随机变量$x$的取值可以是$$x_{1},x_{2},x_{3}…x_{n}$$取到这些值的概率分别为$$P(x_{1}),P(x_{2}),P(x_{3})…P(x_{n})$$
则$x$取值的期望$$E(x)=x_{1}*P(x_{1})+x_{2}*P(x_{2})+x_{3}*P(x_{3})+…+x_{n}*P(x_{n})$$即$$\sum _{k=1}^{n} x_{k}*P(x_{k})$$
通常情况下我们求期望需要列分布列,但实际上分布列是一个综合统计的产物,不方便我们思考,我们这次换一种思路,我们
我们对
Code
错误代码(逃~~
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#define siz 100
using namespace std;
template <class T>
bool read(T &re) {
re=0;
int flag=1;
char c=getchar();
if(c==‘-‘) flag=-1,c=getchar();
while(c>=‘0‘&&c<=‘9‘) re=(re<<1)+(re<<3)+c-‘0‘,c=getchar();
if(c==‘\n‘) return 0;
re*=flag;
return 1;
}
int t,n,m,ai,flag;
long long a[siz];
void search(int p,long long data) {
if(p==n+1) return;
if(data==((1<<(n+1))-2)) { flag=1; puts("YES"); exit(0);}
search(p+1,data|a[p]);
search(p+1,data);
}
int main() {
read(t);
getchar();
while(t--) {
flag=0;
memset(a,0,sizeof(a));
read(n),read(m);
for(int i=1;i<=m;++i)
while(read(ai)) if(ai>0) a[ai]|=(1<<i); //
search(1,0);
if(!flag) puts("NO");
getchar();
}
return 0;
}