2016.09.03【初中部 NOIP提高组 】模拟赛C

T1:这一题用一个dfs从根开始遍历树,每到一个点i都记录一下b[i]和f[i]。其中b[i]表示到i点的时间,f[i]表示完成以i点为根的树的遍历时间。如果点x是点y的祖先,那么b[x]<=b[y],f[x]>=f[y]。

T2:每个人的期望得分=sum((x-y)^2)/n,x代表这个人的实力值,y代表每一个实力比x若的人的实力值,n代表一队的人数。最终ans=A队的实力值和减去B队的实力值和。

        30分:先对实力值进行排序,再用二重循环求出每一个人的期望得分,最后计算结果。

        100分:在求每一个人的期望得分是不用从头枚举。假设要求a[i]的期望得分,用一个指针t指向B队当中比a[i]弱的人当中最强的人,用s表示b[1]至b[t]的实力值的和,用s1表示b[1]^2+b[2]^2+...b[t]^2,a[i]的期望的分为a[i]*(a[i]*t-s)-a[i]*s+s1(自己推一下就可以得出),最后在计算结果。

T3:ans=前n位等于后n位的数量+奇数位等于偶数位的数量-既是前n位等于后n位又是奇数位等于偶数位的数量。

        关键在于怎么求,这是我们可以用动态规划。

        设f[i][j]表示有i个位且所有位上的和位j的数的数量。f[i][j]=f[i][j]+f[i-1][j-v[k]]。1<=i<=n,1<=j<=i*maxnumber,1<=k<=l。maxnumber表示集合中最大的数,v[k]表示集合中的一个数,l表示集合中数的个数。初始值为f[0][0]=1。

        前n位等于后n位的数量:sum(f[n][i]*f[n][i])0<=i<=n*maxnumber

        奇数位等于偶数位同上。

        接下来要做的就是去重。如果前n位等于后n位且奇数位等于偶数位,那么前n位的奇数位等于后n位的偶数位,前n位的偶数位等于后n为的奇数位。设前n位的奇数位的和位i,那么后n位的偶数位的和也为i。设前n位的偶数位的和位j,那么后n为的奇数位的和也为j。所以我们只需枚举i,j即可。计算公式为:sum(f[(n+1)/2][i]*f[(n+1)/2][i]*f[n/2][j]*f[n/2][j])0<=i<=(n+1)/2*maxnumber,0<=j<=n/2*maxnumber。

你可能感兴趣的:(【初中部,NOIP提高组,】模拟赛C)