总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有意思的东西。
比如现在,bx2k就在研究怎样水表情的问题。
首先,bx2k在对话框中输入了一个表情
,接下来,他可以进行三种操作。
第一种,是全选复制,把所有表情全选然后复制到剪贴板中。
第二种,是粘贴,把剪贴板中的表情粘贴到对话框中。
第三种,是退格,把对话框中的最后一个表情删去。
假设当前对话框中的表情数是num0,剪贴板中的表情数是num1,
那么第一种操作就是num1=num0
第二种操作就是num0+=num1
第三种操作就是num0--
现在bx2k想知道,如果要得到n(1<=n<=10^6)个表情,最少需要几次操作。
请你设计一个程序帮助bx2k水群吧。
Input
一个整数n表示需要得到的表情数
Output
一个整数ans表示最少需要的操作数
Input示例
233
Output示例
17
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N =1001111; const int p[6]= {2,3,5,7,11,13}; int dp[N]; int vis[N]; int main() { memset(dp,0x3f,sizeof(dp)); int n; scanf("%d",&n); queue<int>q; q.push(1); vis[1]=1; dp[1]=0; while(!q.empty()) { int x=q.front(); q.pop(); vis[x]=0; if(x-1>=1) { if(dp[x-1]>dp[x]+1) { dp[x-1]=dp[x]+1; if(vis[x-1]==0) { vis[x-1]=1; q.push(x-1); } } } for(int i=0; i<6; i++) { int prim=p[i]; int y=prim*x; if(y<=n+10) { if(dp[y]>dp[x]+prim) { dp[y]=dp[x]+prim; if(!vis[y]) { vis[y]=1; q.push(y); } } } } } printf("%d\n",dp[n]); return 0; }