首页 > 其他分享 >[Violet 5]列队春游

[Violet 5]列队春游

时间:2022-10-02 17:23:37浏览次数:87  
标签:cdot dfrac sum int 春游 Violet 列队 aligned 式子

Description

link

Solution

考虑对于每一个人算贡献。

令 \(P(i)\) 表示这个人视野距离为 \(i\) 的概率, \(Q(i)\) 表示视野距离不小于 \(i\) 的概率,令 \(k\) 表示能够阻拦这个人视野的人的个数(当然不包括当前人)。

那么贡献即为:

\[\sum_{i=1}^{n}{i\times P(i)} \]

把这个式子转化下为:

\[\sum_{i=1}^{n}{Q(i)} \]

所以这时候只需要算出来 \(Q(i)\) 即可,那么:

\[Q(i)=\dfrac{(n-i+1)\cdot A_{n-k-1}^{i-1}\cdot (n-i)!}{n!} \]

这个式子中 \((n-i+1)\) 表示当前人有 \(n-i+1\) 个位置可以选。
\(A_{n-k-1}^{i-1}\) 表示当前人前面的 \(i-1\) 个位置只能由不能阻拦当前人视野的人来选,一共有 \(n-k-1\) 个人。
\((n-i)!\) 就表示除了当前人和其前面的 \(i-1\) 人外,其他人全排列的方案数。


然后化简即可:

\[\begin{aligned} ans&=\sum_{i=1}^{n}{\dfrac{(n-i+1)\cdot A_{n-k-1}^{i-1}\cdot (n-i)!}{n!}}\\ &=\sum_{i=1}^{n}{\dfrac{(n-i+1)\cdot\dfrac{(n-k-1)!}{(n-k-i)!}\cdot (n-i)!}{n!}}\\ &=\dfrac{(n-k-1)!}{n!}\cdot\sum_{i=1}^{n}{\dfrac{(n-i+1)!}{(n-k-1)!}}\\ &=\dfrac{(n-k-1)!}{n!}\cdot (k+1)!\cdot\sum_{i=1}^{n}{C_{n-i+1}^{k+1}} \end{aligned} \]


然后考虑这样一个式子:

\[\sum_{i=1}^{n}{C_{i}^{k}} \]

这个式子的组合意义就是在 \(n+1\) 个不同元素中选取 \(k+1\) 个元素的方案数。这里相当于就是枚举选的元素中编号最大的,假设为 \(s\),那么方案数就为 \(\sum\limits_{s=1}^{n+1}{C_{s-1}^{k}}=\sum\limits_{i=1}^{n}{C_{i}^{k}}=C_{n+1}^{k+1}\)。

所以 \(\sum\limits_{i=1}^{n}{C_{n-i+1}^{k+1}}=C_{n+1}^{k+2}\).


那么:

\[\begin{aligned} ans=&\dfrac{(n-k-1)!}{n!}\cdot (k+1)!\cdot C_{n+1}^{k+2}\\ =&\dfrac{(n-k-1)!}{(k+1)!}\cdot (k+1)!\cdot \dfrac{(n+1)!}{(k+2)!\cdot (n-k-1)!}\\ =&\dfrac{n+1}{k+2} \end{aligned} \]


所以就可以线性求解了。

Code

代码
#include <bits/stdc++.h>

#ifdef ORZXKR
#include <debug.h>
#else
#define debug(...) 114514
#endif

using namespace std;

const int kMaxN = 305, kMaxA = 1005;

int n, x;
int sum[kMaxA];
double ans;

int main() {
  cin >> n;
  for (int i = 1, x; i <= n; ++i) {
    cin >> x;
    ++sum[x];
  }
  for (int i = 1; i <= 1000; ++i) {
    ans += sum[i] * (n + 1) * 1.0 / (n - sum[i - 1] + 1);
    sum[i] += sum[i - 1];
  } 
  cout << fixed << setprecision(2) << ans << endl;
  return 0;
}

标签:cdot,dfrac,sum,int,春游,Violet,列队,aligned,式子
From: https://www.cnblogs.com/Soba/p/16749056.html

相关文章

  • P3960 NOIP2017 提高组 列队
    P3960NOIP2017提高组列队将每一行的第1到m-1个和第m列分离出来分析知这n+1个“区间”要维护弹出第k个和插入最后使用平衡树,一个区间若没有被算则用[l,r]表示(方伯伯......
  • 【NOIP2017 提高组】列队
    [【NOIP2017提高组】列队](https://www.luogu.com.cn/problem/P3960)将每一行的第1到m-1个和第m列分离出来分析知这n+1个“区间”要维护弹出第k个和插入最后使用平衡树,......
  • NC16122 郊区春游
    题目链接题目题目描述今天春天铁子的班上组织了一场春游,在铁子的城市里有n个郊区和m条无向道路,第i条道路连接郊区Ai和Bi,路费是Ci。经过铁子和顺溜的提议,他们决定去其中......
  • Bzoj 2724 [Violet 6]蒲公英
    原题链接https://darkbzoj.cc/problem/2724大致题意:给一个长度为n的序列,进行m次询问,每次询问输出区间内出现次数最多的数,强制在线。离散化加分块对于离散化后的每个数......