51nod 1693 水群

基准时间限制:0.4 秒 空间限制:524288 KB 分值: 160 难度:6级算法题

 收藏

 关注

总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有意思的东西。

比如现在,bx2k就在研究怎样水表情的问题。

首先,bx2k在对话框中输入了一个表情,接下来,他可以进行三种操作。

第一种,是全选复制,把所有表情全选然后复制到剪贴板中。

第二种,是粘贴,把剪贴板中的表情粘贴到对话框中。

第三种,是退格,把对话框中的最后一个表情删去。

假设当前对话框中的表情数是num0,剪贴板中的表情数是num1,

那么第一种操作就是num1=num0

第二种操作就是num0+=num1

第三种操作就是num0--

现在bx2k想知道,如果要得到n(1<=n<=10^6)个表情,最少需要几次操作。

请你设计一个程序帮助bx2k水群吧。

Input

一个整数n表示需要得到的表情数

Output

一个整数ans表示最少需要的操作数

Input示例

233

Output示例

17

解法一

spfa

知道点电脑的都知道 一直复制相同的东西是无意义的

所以我们把第一第二种操作看为一种

而且我们还发现 某个点可以被多个点连接

多次连接耗时太多

所以我们只需连到他的质数倍就可以了

经研(ti)究(jie)发现 只有小于等于13的质数才对结果有影响

解法二

dp (来自myj Orz)

屠龙宝刀点击就送

#include <cstring>
#include <cstdio>
#include <queue>
#define N 1000005

using namespace std;
bool notPrime[N],vis[N];
int Prime[N]={0,2,3,5,7,11,13,19},num,n,dis[N];
void spfa()
{
    queue<int>q;
    q.push(1);
    memset(dis,0x3f,sizeof(dis));
    vis[1]=1;
    dis[1]=0;
    for(int now;!q.empty();)
    {
        now=q.front();q.pop();
        vis[now]=0;
        for(int i=1;i<=7;++i)
        {
            int v=now*Prime[i];
            if(v>n+20) break;
            if(v<n+20&&dis[v]>dis[now]+Prime[i])
            {
                dis[v]=dis[now]+Prime[i];
                if(!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
        if(now>0&&dis[now-1]>dis[now]+1)
        {
            dis[now-1]=dis[now]+1;
            if(!vis[now-1])
            {
                vis[now-1]=1;
                q.push(now-1);
            }
        }
    }
}
void init()
{
    notPrime[1]=1;
    for(int i=2;i<=N-5;++i)
    {
        if(!notPrime[i]) Prime[++num]=i;
        for(int j=1;j<=num&&i*Prime[j]<=N-5;++j)
        {
            notPrime[i*Prime[j]]=1;
            if(i%Prime[j]==0) break;
        }
    }
}
int main()
{
    scanf("%d",&n);
    //init();
    spfa();
    printf("%d\n",dis[n]);
    return 0;
}

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;
int n,dp[1000045],lit;
int main()
{
    cin>>n;
    memset(dp,127/3,sizeof(dp)),dp[1]=0;
    for(int i=1,v,base;i<=n+40;++i)
    {
        base=dp[i];
        for(v=1;true;++v)
            if(dp[i+v]+v<=base) base=dp[i+v]+v;
            else break;
        dp[i]=base,++base;
        for(v=1;i+v*i<=n+40;++v)
            dp[i+v*i]=min(dp[i+v*i],base+v);
    }
    cout<<dp[n];
    return 0;
}

dp (Orz myj)

时间: 2024-08-13 15:44:48

51nod 1693 水群的相关文章

51nod 1693 水群(Dijkstra)

分析:一开始想暴力dp,但是有环,不好处理..考虑建一个图,从k向k-1连一条边权为1,向i*k连一条边权i*k的边,然后Dijkstra,复杂度为O(nlogn(loglog(n)),然而这数据范围..这时间限制.. 可以简化,只连k乘一个质数p的边,并且p<=13,虽然并不会证明..可以用未优化过的打个表,发现答案不超过43,因此至少在这个范围内是可行的.. Dijkstra一开始常数太大了,因为是把边加进去再做的,可以优化成直接利用点得到边. 1 #include<iostream>

51nod1693 水群

QwX (题目提供者) 首先简化题目,题面的意思就是,当前有一个数s 操作1是s*=k代价为k,操作2是s--代价为1 求把s从1变到n的最小代价 做法1: 直接暴力记忆化搜索,F(i)表示从1到i用的最小操作数 则F(i)=min(F(i+1),min{F(k)+n/k|n%k==0}) 当然这样做肯定过不了 做法2: 考虑把问题转换成图论模型,对于每个i 连边i→i-1边权为1,连边i→i*k边权为k 那么题目就是要求点1到点n的最短路 但是很显然这样复杂度还是很高并不能过 做法3: 注意到

大数相乘 51nod 1027 水题

给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 <= 1000,A,B >= 0) Output 输出A * B Input示例 123456 234567 Output示例 28958703552 把两个数倒序放在数组里,然后算第一个数乘以一到九的值再通过位数去加在一起具体看程序 1 #include <iostream> 2 using namespace std; 3 #include<string.h> 4

51nod 博弈论水题

51nod1069 Nim游戏 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N及每堆石子的数量,问最后谁能赢得比赛. 例如:3堆石子,每堆1颗.A拿1颗,B拿1颗,此时还剩1堆,所以A可以拿到最后1颗石子. /*对于某个局面(a1,a2,...,an),若a1^a2^...^an<>0,一定存在某个合法的移动,将ai改变成ai'后满足a1^a2^...^ai'^..

谈谈程序员解决问题的能力

谈谈程序员解决问题的能力 解决问题的能力,程序员立业之本. 一般写文章我不会特意去写,而是有感而发的时候刚好又有时间我就会去写写文字.本想推些技术文章的,但写技术文章又很耗时,写得太浅显又没有技术含量,写多了恐怕大家也没耐心去看(不就是懒么,给自己找这么多借口).公众号这么多,你又能看的了多少呢?小巫这个公众号不会像某些网红那样每天都想破脑袋去写文章,也不期望这个公众号能给我带来什么,毕竟以我的尿性我让我每天写鸡汤文我自己都会恶心.好了,进入今天这篇文章的主题,跟大家谈谈程序员解决问题的能力.

大一上

在进大学前,我从来没想过我将来会进入计算机专业,甚至对未来都没有什么规划,也不知道自己究竟喜欢什么专业.大一前的那个暑假,大部分时间,是在水群和打游戏中度过的,到了开学前也只是会简单的Hello World程序. 一开始,我是在水群中无意接触到西二在线,那时候我对它的印象是,大牛们的聚集地.那时候,我虽然向往,却没有充足的自信,我一直在报名与不报名中犹豫.后来,我在计算机五班水群的时候,4+GG一开始以为我是计五的小学弟,加了我的QQ,并向我打招呼.接触4+GG这样的大佬,我很激动.在聊天的过程

SHOI2016游记&amp;滚粗记&amp;酱油记

Day0 学校刚期中考完,全科血崩,感觉这次真要考不到一本线了tat 晚上写了个可持久化trie的题,也懒得敲板子(上个礼拜都敲过了),就碎叫了 Day1 上午起床吃饭水群看球,吃完中饭就去考场了. 下雨,路上花了挺长时间,到的挺晚的.然后就开考了. 这次和LN.JL是同一套卷子,感觉丢脸要丢到外省去了啊TAT 看题,T1是一棵树,然后可以插眼啥的题,求最小费用.感觉一脸可做啊,应该是树DP,感觉做过类似的题? 不过决定先看完题目.然后再看T2,网格图挖点求正方形个数,这怎么做啊qaq 然后再看

msp

10月8号加入了微软的msp项目,其实那时候对msp没有什么概念,不知道要干嘛,真的觉得大不了就退出呗,反正也没啥大事,   现在再也不那么看了,这二十多天虽然没怎么水群,但是还是一直在关注着我们这个群,每天都在看各种各样或奇葩或古怪的消息,有些东西真心听不懂,但是也算是增长了许多见识,听不懂的词就去上网百度,也在慢慢融入大家.对于一个比较垃圾的大学的学习方面比较垃圾的一个msp来说,学到一点东西也是有用的.   但是现实还是有点残酷,啥都不懂,真心有点慌,现在开始有点担心自己会不会被刷掉,第一

一句话记录一段时间...

有些东西,其实并没有什么大不了,只不过,现在的有些群,的确真心污染严重 ! 如果是自己真心想看的话,其实看也无所谓! 但是麻蛋,不是! 恨死了初中的那个破水群!喵了个咪的!!!! 其实自己并不是介意这些莫名其妙的东西,也并不想演盖 自己有多么纯洁,只是,玛德,你就是有这种 不想承认自己多么纯洁,但也不想莫名其妙的误解的尬尴!!!! 其实对于男生而言,真心玩得好的,其实都会知道! 那点事,真心没什么! 搞得好像封建思想这么严重,我去. 又不是女生! 只是成为程序猿好久了,忙得没时间,来说这些恶搞罢