2023NOIP A层联测25 T2 游戏

发布时间 2023-11-06 23:05:12作者: 彬彬冰激凌

2023NOIP A层联测25 T2 游戏

优秀且新颖的期望题。

思路

分析问题,由于双方都是最优策略,所以可以说学生知道老师会选择那些教室设置概率(概率设置好就不能改变),老师也知道学生会怎样选择教室(不是知道一定会去那个)。

设老师选择的集合是 \(S\)

那么老师在学生不清空的情况下,老师的期望为 \(\sum_{i\in S} p_ia_i\)\(p_i\) 是概率)。

学生知道每一项 \(i\) 的贡献,所以由于学生要使老师的期望最小,那么学生肯定选 \(\max(p_ia_i)\)

于是答案为 \(\sum_{i\in S} p_ia_i-\max(p_ia_i)\)

对于最大的那一项 \(p_ia_i\) 来说,由于他们肯定会被选走,所以说老师不妨把 \(p_i\) 改小一点,多出来的概率分给其他的数,虽然总和减小了,但被减掉的部分也减小了,而且不会被减掉的部分增加了,所以答案将获得最优。

那么最好情况下,我们要使得 \(\sum_{i \in S} p_i=1\) 且对于任意 \(i\) 而言 \(p_ia_i\) 相等。

可以构造

\[p_k=\frac{\frac{1}{a_k}}{\sum_{i \in S} \frac{1}{a_i}} \]

这个 \(p_k\) 是符合条件的。

现在问题变为要怎样是答案最大。

答案最大要是 \(p_i\) 最小,\(p_i\) 最小要使 \(\sum_{i \in S} \frac{1}{a_i}\) 最小,也就是使 \(\sum a_i\) 最大。

设集合 \(S\)\(m\) 个数,那么取最大 \(m\) 个即可。

而且这样答案合式可化为:

\[\sum_{i\in S} p_ia_i-\max(p_ia_i)=\frac{m}{\sum_{i \in S} \frac{1}{a_i}}-\frac{1}{\sum_{i \in S} \frac{1}{a_i}}=\frac{m-1}{\sum_{i \in S} \frac{1}{a_i}} \]

对答案排序后,枚举 \(m\) 即可。

CODE

#include<bits/stdc++.h>
using namespace std;

int n;
int a[55];

double ans,sum;

bool cmp(int a,int b){return a>b;}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++) sum+=1.0/a[i],ans=max(ans,(i-1)/sum);
    printf("%.12lf",ans);
}