[CSP-S模拟测试]:666(模拟)

题目描述

不忘初心。

  小$\pi$假期在家无聊,打开了某弹幕直播网站。
  突然,有一个精彩的镜头。
  小$\pi$看到了满屏的$6$,其中,有$666$、也有$666666$、也有$6666666666...$
  小$\pi$也想发个弹幕,他打算发$n$个$6$。
  然而当他按下第一个$6$时,键盘上$6$的键坏了。
  这时,弹幕框里只有$1$个$6$。
  键盘坏了什么的不要紧,先把弹幕发了才是正事。
  于是小$\pi$打算用复制粘贴这类操作来生成这$n$个$6$。
  具体的说,小$\pi$电脑的操作系统有唯一的一块剪贴板,初始为空,现在小
  $\pi$一共有三种操作:
  第$1$种操作,全选然后复制。这样会把剪贴板里的内容设置为当前弹幕框内内容。
  第$2$种操作,粘贴。会把剪贴板中的内容连接到弹幕框现有的内容后面。
  第$3$种操作,$backspace$。会把在当前弹幕框中删除一个$6$。
  小$\pi$很好奇现在生成想要的$n$个$6$至少需要多少次操作,来找到了学信息学竞赛的你。
  注意本题时间限制


输入格式

  一行一个整数$n$。


输出格式

  一行一个整数$ans$,表示最少操作次数。


样例

样例输入1:

0

样例输出1:

1

样例输入2:

3

样例输出2:

3


数据范围与提示

  其中$6\%$的数据,$n=2^k$,$k$为正整数。
  其中$24\%$的数据,$n\leqslant 1,000$。
  其中$20\%$的数据,内存扩充至$768MB$。
  其中$20\%$的数据,时间扩充到$3s$。
  其中$30\%$的数据,无特殊限制。
  所有数据存在一种划分方法,使得上述范围两两没有交集。
  对于$100\%$的数据,$0\leqslant n\leqslant 1,000,000$。


题解

模拟全过程。

设$f[i]$表示$i$个$6$的步数,初始时将其都付成没有访问过,$f[1]=0$。

然后每次暴力扫,用现在有的更新即可。

因为最多会走$48$步,所以时间复杂度是对的。

时间复杂度:$\Theta(48\times n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
int n,dp[1000100],bs;
int main()
{
	scanf("%d",&n);
	memset(dp,-1,sizeof(dp));
	dp[1]=0;int now=n+50;
	while(dp[n]==-1)
	{
		bs++;
		for(register int i=1;i<=now;i++)
		{
			if(dp[i]==-1)continue;
			register int flag=i*(bs-dp[i]);
			if(flag<=now&&dp[i]<bs&&dp[flag]==-1)dp[flag]=bs;
			if(dp[i-1]==-1)dp[i-1]=dp[i]+1;
		}
	}
	printf("%d",dp[n]);
	return 0;
}

rp++

猜你喜欢

转载自www.cnblogs.com/wzc521/p/11747082.html