POJ Challenge—(G)Guitar Hero

lqp18_31    Orz。。。。

G:吉他英雄

时间限制:
1000ms
内存限制:
65536kB
描述

1tthinking 特别喜欢玩‘guitar hero’。 现在有 N (2 ≤ N ≤ 50) 首歌在这个游戏中,他们被标为 1 到 N。 游戏会随机把歌曲分组 P。 更详细的说, 对于 P = <P1, P2, ... PN>, 游戏会在第 i 首之后播放第 Pi首。 因此这 N 首歌会形成几个循环来播放. 举个例子, 如果 N = 3, P = <2, 1, 3> 我们得到了 {1, 2} 和 {3} 两个循环.

每首歌有一个积分值,1thinking特别喜欢玩Queen的 'Another One Bites The Dust',每次他一定会玩这首歌。现在1thinking知道这首歌是积分值 第二大 的歌曲。他想知道他喜欢的歌所在的循环的分数和。 现在给出N首歌的难度值,求1tthinking游戏一次所获得的期望积分和是多少?

举 个例子,当前有三首歌,积分为1、2、3。1tthinking总是会选择积分为2的歌曲。一共可能的排列有6种: <1, 2, 3>, <1, 3, 2>, <2, 1, 3>, <2, 3, 1>, <3, 1, 2> and <3, 2, 1>。 1tthinking分别会等概率选择 {2}, {2, 3}, {1, 2}, {1, 2, 3}, {1, 2, 3}, {2} 获得 2, 5, 3, 6, 6, 2 分。平均可以获得 (2 + 5 + 3 + 6 + 6 + 2) / 6 = 24 / 6 = 4.0000 分。

输入

第一个整数 T, 数据的组数。

对于每组数据,第一行,整数 N,表示排列的长度。

第二行,N个整数 V1, V2, ..., VN, 每首歌的积分值。(0 ≤ Vi < 231)

输出

对于每组数据,一个浮点数,期望积分(精确到 0.000001)。

样例输入
1
3
1 2 3
样例输出
4.000000


  首先声明,这不是标准算法,但是确实可以AC的……求鄙视。
  看完题,我是完全没有头绪!#@%#¥%数学弱啊无奈,于是我开始研究样例……
  我发现在样例中n=3时,一共有6种情况。然后呢,每种情况的方案在题中有,我们把大括号去掉之后变成什么了呢?
          {2}, {2, 3}, {1, 2}, {1, 2, 3}, {1, 2, 3}, {2}
                    ↓
                   2,2,3,1,2,1,2,3,1,2,3,2
                    ↓
                 1×3,2×6,3×3
  因为距离比赛结束还有十五分钟,我大胆假设:对于n,它所存在的情况数为2n,对于每个状态的选取,处于分值次大的将会被选取2n次,而其他的将被选取n次,那么我只需要求和除以2n就可以了。于是我飞速写了一个模拟……然后就1A了……
var a:array[1..1000]of longint;
        first,second,poss,posf,n,t,i,sum:longint;
begin
	readln(t);
	while t>0 do
		begin
			dec(t);
			readln(n);
			first:=-maxlongint;
			second:=-maxlongint;
			for i:=1 to n do
				begin
					read(a[i]);
					if a[i]>first then begin
											second:=first;first:=a[i];
											poss:=posf;posf:=i;end
						else if a[i]>second then begin second:=a[i];poss:=i;end;
				end;
			readln;
			sum:=0;
			for i:=1 to n do
				if i<>poss then inc(sum,a[i]*n)
					else inc(sum,a[i]*n*2);
			writeln((sum/n/2):0:6);
		end;
end.

原文地址:https://www.cnblogs.com/Delostik/p/2012026.html