Bestcoder#5 1003

Bestcoder#5 1003

Poor RukawTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 24    Accepted Submission(s): 11


Problem Description

Last time, Hanamichi lost the basketball battle between him and Rukaw. So these days he had a burning desire to wreak revenge. So he invented a new game and asked Rukaw to play with him. What’s more, the loser should confess his ignorance and on the other hand the winner can go on a trip with Haruko.

Hanamichi knows the game well (as he invented it), and he always chooses the best strategy, however Rukaw is not so willing to play this game. He just wants it to be finished as soon as possible so that he can go to play basketball. So he decides not to think about the best strategy and play casually.

The game’s rules are here. At first, there are N numbers on the table. And the game consists of N rounds. Each round has a score which is the number of the numbers still left on the table. And Each round there will be one number to be removed from the table. In each round, two players take turns to play with these numbers.To be fair, Rukaw plays first in the first round. If there’s more than 1 numbers on the table, players can choose any two numbers they like and change them to a number abs(x-y). This round ends when there’s only one number left on the table, and if this number is an odd number, Rukaw wins, otherwise Hanamichi wins. The score of this round will be add to the winner. After that, all numbers will be recovered to the state when this round starts. And the loser of this round has the right to remove one number and he also has the right to play first in the next round. Then they use the remaining numbers to start next round. After N rounds, all numbers removed and this game ends. The person who has more scores wins the whole game.

As you know, Rukaw has already decided to play casually, that is to say, in his turn, he chooses numbers randomly, each numbers left on the table has the same possibility to be chosen. When a round ends, if Rukaw is the loser, he also randomly chooses a number to remove. And Hanamichi will always choose numbers or remove numbers to maxmium his final total score. Here comes the question:
Given the N numbers on the table at the beginning, can you calculate the expectation of the final score of Hanamichi. (We don’t care about who wins the whole game at all.)

 

 

Input

This problem contains multiple tests.
In the first line there’s one number T (1 ≤ T ≤ 200) which tells the total number of test cases. For each test case, there a integer N (1 ≤ N ≤ 1000) in the first line, and there are N intergers Ai , i = 1, 2, … , N (1 ≤ Ai ≤ 100000), in the second line which are the numbers at the beginning.

 

 

Output

This problem is intended to use special judge. But so far, BestCoder doesn’t support special judge. So you should output your answer in the following way. If the expectation you get is X, output \([3\times X+0.5]\) in a line. Here, [A] means the largest integer which is no more than A.

 

 

Sample Input

222 421 2

 

 

Sample Output

93

Hint

In the first example, Hanamichi will always win two rounds and the score of two rounds will be 2 and 1. So the answer is 3. (And you should output 9.) In the second example, Rukaw wins the first round. And after that Hanamichi has the right to choose a number from 1 and 2 to remove. (Because this round started with this two numbers.) And We know that he will choose 1 to maximum his final total score. So when the second round starts, there’s only one number 2 left on the table and Hanamichi plays first. He immediately wins this round and got 1 point. Then the game ends. So the answer is 1.(And you should output 3.)

 

错误点:概率dp,因为cnt没初始化,RE

思路:想到了奇偶关系以及转化关系,但是没有想到如何处理那么多状态,其实后面的状态是重复的,所以dp从后向前考虑就可以得到答案。。是不是概率dp都是这个思路??

 1 #include <vector>
 2 
 3 #include <cstdio>
 4 
 5 #include <cstring>
 6 
 7 #include <iostream>
 8 
 9 #include <algorithm>
10 
11 using namespace std;
12 
13 
14 
15 const int N = 1005;
16 
17 
18 
19 double func[1005][1005];
20 
21 
22 
23 int main()
24 
25 {
26 
27     func[0][0] = 0;
28 
29     for(int i = 1;i<N;i++)
30 
31         for(int j = 0;j<=i;j++)
32 
33     {
34 
35         if(j%2==1)
36 
37         {
38 
39             func[i][j] = func[i-1][j-1];
40 
41         }
42 
43         else
44 
45         {
46 
47             func[i][j] = i+func[i-1][j]*(i-j)*1.0/i+func[i-1][j-1]*j*1.0/i;
48 
49         }
50 
51     }
52 
53     int T,n,cnt=0;
54 
55     scanf("%d",&T);
56 
57     while(T--)
58 
59     {
60 
61         cnt = 0;
62 
63         scanf("%d",&n);
64 
65         int a;
66 
67         for(int i = 0;i<n;i++)
68 
69         {
70 
71             scanf("%d",&a);
72 
73             if(a%2==1)
74 
75                 cnt++;
76 
77         }
78 
79         //cout<<n<<' '<<cnt<<endl;
80 
81         int ans = 3*func[n][cnt]+0.5;
82 
83         printf("%d\n",ans);
84 
85     }
86 
87     return 0;
88 
89 }

 

转载于:https://www.cnblogs.com/haohaooo/p/4035360.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值