CodeForces 1453D 概率 期望
作者:互联网
CodeForces 1453D Checkpoints 概率 期望
题意
现在我们可以设计n个擂台,有的是激活点,有的不是。从第一个开始挑战,每次都有1/2的概率成功,如果该点成功,则跳到下一个节点,否则跳到上一个最近的激活点继续挑战(如果本身是激活点,则还是在原地)。
给定我们一个小于1e18的数k,要求我们设计出一个n<=2000的一排擂台(1为激活,0为未激活(第一个必须为1)),使得最终挑战次数的期望为k,不能的话输出-1
思路
此题的原理可以从洛谷P6835中学到(P6835)(P6835题解),由于期望的线性性质,所以我们的最终期望是每个点到下个点的期望之和。
- 根据P6835中的原理可知每个1贡献2的期望,而每个0的贡献为
- 所以首先如果k为奇数,则直接输出-1,否则先设置1号为1,k-=2,之后按照k的二进制来添加连续的0以及穿插1。
AC代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int t;
long long k;
long long anss[2005];
int main()
{
scanf("%d", &t);
while (t--)
{
memset(anss, 0, sizeof(anss));
scanf("%lld", &k);
if (k % 2)
{
printf("-1\n");
continue;
}
long long n = 0;
anss[++n] = 1;
k = k - 2;
for (long long j = 1; j <= 61; ++j)
{
if (((long long)1 << j) & k)
{
if (j == 1)
anss[++n] = 1;
else
{
anss[++n] = 1;
anss[++n] = 1;
for (long long l = 3; l <= j; ++l)
{
anss[++n] = 0;
}
}
}
}
printf("%lld\n", n);
for (int i = 1; i < n; ++i)
{
printf("%lld ", anss[i]);
}
if (n)
{
printf("%lld\n", anss[n]);
}
}
return 0;
}
标签:期望,anss,CodeForces,long,P6835,1453D,include 来源: https://www.cnblogs.com/int-me-X/p/14111486.html