CF#688 D. Checkpoints

11 篇文章 0 订阅
7 篇文章 0 订阅

CF #688D

原题链接

题意:构造一串长为n的01序列 ( n ≤ 2000 ) (n\leq 2000) (n2000),有 1 2 \frac12 21的概率成功通过第i个关卡,如果失败,立即返回到小于等于i的最大的1位置。

为何单独一个1,通过的期望次数是2呢?
我们假设穿过一个单独的1的期望是x
1 2 \frac12 21的概率一次通过,也有 1 2 \frac12 21的概率失败,那么还需要x的期望通过。
于是 x = 1 2 ∗ 1 + 1 2 ∗ ( x + 1 ) x=\frac12*1+\frac12*(x+1) x=211+21(x+1),可以求得x = 2。

我们最后构造的序列可以分解成若干 1000 … 1000\dots 1000序列的形式

我们定义 f [ i ] f[i] f[i]为开头一个1,后面跟i - 1个0的期望步数。

那么由上面的推导得 f [ 1 ] = 2 f[1] = 2 f[1]=2

可得下面的式子:
f [ i ] = f [ i − 1 ] + 1 + 1 2 ∗ { f [ i − 1 ] + ( f [ i ] − f [ i − 1 ] ) } f[i]=f[i-1]+1+\frac12*\{f[i-1]+(f[i]-f[i-1])\} f[i]=f[i1]+1+21{f[i1]+(f[i]f[i1])}

为什么是这个方程呢?

想通过第i个关卡,前提是突破前i - 1个关卡,期望是 f [ i − 1 ] f[i-1] f[i1]
现在我们用一步尝试通过第i个关卡,期望是1
1 2 \frac12 21的概率突破了第i个关卡,这样就不需要多余的步数。
如果突破失败,就要回到上一个1的位置,回到第i - 1的位置需要步数 f [ i − 1 ] f[i-1] f[i1],突破第i个关卡需要期望 f [ i ] − f [ i − 1 ] f[i]-f[i-1] f[i]f[i1]
移项就能得到, f [ i ] = 2 ∗ f [ i − 1 ] + 2 f[i]=2*f[i-1]+2 f[i]=2f[i1]+2

我们可以发现只有期望为偶数时,才能构造,奇数无解。
偶数直接从大到小构造1000 … \dots 串即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int MAXN = 1e6 + 10;
const int mod = 1e9 + 7;
vector<int> ans;
ll pre[100];
int main() 
{
	int t;
	scanf("%d", &t);
	for (int i = 1; i <= 60; i++) {
		pre[i] = pre[i - 1] * 2 + 2;
	}
	while (t--) {
		ans.clear();
		ll k;
		scanf("%lld", &k);
		bool flag = false;
		while (k) {
			for (int i = 60; i >= 1; i--) {
				if (pre[i] <= k) {
					k -= pre[i];
					ans.emplace_back(1);
					for (int j = 1; j < i; j++) {
						ans.emplace_back(0);
					}
					break;
				}
			}
			if (k & 1) {
				flag = true;
				break;
			}
		}
		if (flag || ans.size() > 2000) {
			printf("-1\n");
			continue;
		}
		cout << ans.size() << endl;
		for (int i = 0; i < ans.size(); i++) {
			if (i) printf(" ");
			printf("%d", ans[i]);
		}
		printf("\n");
	}
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/
最新发布
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值