zoukankan      html  css  js  c++  java
  • 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.
    

  • 相关阅读:
    [原创]iFPGACable FT2232H JTAG & UART调试器
    [原创]创芯电子实验室iFPGACable JTAG工具实物图
    [原创]FPGA JTAG工具设计(一)
    [方案]基于Zynq WiFi方案构建
    [原创]基于Zynq Linux环境搭建(四)
    [原创]基于Zynq Linux环境搭建(二)
    [原创]基于Zynq Linux环境搭建(三)
    [原创]Zynq AXICDMA测试结果
    [原创]基于Zynq Linux环境搭建(一)
    git使用教程及github远程仓库管理
  • 原文地址:https://www.cnblogs.com/Delostik/p/2012026.html
Copyright © 2011-2022 走看看