绵阳东辰国际test2019.11.04am
吐槽:我的做法假了,我以为是贪心,结果是dp
分析:
首先分析到小Y不会往回走
dp[u] 表示小 Y 的棋子在 u 时,如果只考虑 u 节点的子树,那么小 D 要获胜至少需要先操作多少次
code:
# include <cstdio>
# include <iostream>
# define R register int
using namespace std;
const int N=100005;
int n,x,p[N],bro[N],son[N],f[N];
void dfs (int x)
{
if(!son[x]) { f[x]=1; return; }
for (R i=son[x];i;i=bro[i])
dfs(i),f[x]+=f[i];
f[x]=max(0,f[x]-1);
}
int main()
{
scanf("%d",&n);
for (R i=2;i<=n;++i)scanf("%d",&x),bro[i]=son[x],son[x]=i;
dfs(1);
if(!f[1]) puts("D");
else puts("Y");
return 0;
}
题不难,关键在于想不想得到
吐槽:csp—s不会考计算几何吧
分析:
首先直接看题目不太好做诶,
由于期望的线性性:
所以可以枚举每个部分被切掉的情况,
计算出此时被切掉的面积与这种情况发生的概率之积,最后相加就是答案
code :
#include <cstdio>
typedef long double db;
const int maxn = 2500;
int n, k;
db c[maxn + 3][maxn + 3], x[maxn + 3], y[maxn + 3], ans;
int main() {
scanf("%d %d", &n, &k);
for (int i = 0; i <= n; i++) {
c[i][0] = c[i][i] = 1;
for (int j = 1; j < i; j++)
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
}
for (int i = 1; i <= n; i++)
scanf("%Lf %Lf", &x[i], &y[i]);
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
ans += ((c[j - i - 1][k - 2] - c[n - (j - i + 1)][k - 2]) / c[n][k]) * ((x[i] - x[j]) * (y[i] + y[j]));
printf("%.9Lf\n", ans / 2);
return 0;
}
T3不会