绵阳东辰国际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不会

posted @ 2019-11-04 17:11  wzx_believer  阅读(167)  评论(0编辑  收藏  举报