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>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<queue>
 5 #include<vector>
 6 using namespace std;
 7 const int maxn=1e6+10;
 8 int pri[100],len=0;
 9 struct Edge{
10     int from,to,dist;
11     Edge(int u,int v,int d):from(u),to(v),dist(d){}
12 };
13 struct Node{
14     int d,u;
15     Node(int d0,int u0):d(d0),u(u0){}
16 };
17 bool operator < (Node a,Node b){
18     return a.d>b.d;
19 }
20 struct Dijkstra{
21     int n;
22     int d[maxn];
23     void dijkstra(int s){
24         priority_queue<Node> q;
25         for(int i=0;i<n;i++)d[i]=1e9;
26         d[s]=0;
27         q.push(Node(0,s));
28         while(!q.empty()){
29             Node x=q.top();
30             q.pop();
31             int u=x.u;
32             if(d[u]!=x.d)continue;
33             for(int i=0;i<len&&pri[i]*u<=n;i++){
34                 if(d[pri[i]*u]>d[u]+pri[i]){
35                     d[pri[i]*u]=d[u]+pri[i];
36                     q.push(Node(d[pri[i]*u],pri[i]*u));
37                 }
38             }
39             if(u>0&&d[u-1]>d[u]+1){
40                  d[u-1]=d[u]+1;
41                 q.push(Node(d[u-1],u-1));
42             }
43         }
44     }
45 }dij;
46 void CalPri(){
47     int maxn=14;
48     bool no_Pri[maxn];
49     memset(no_Pri,0,sizeof(no_Pri));
50     for(int i=2;i<maxn;i++){
51         if(!no_Pri[i]){
52             pri[len++]=i;
53         }
54         for(int j=0;j<len&&pri[j]*i<maxn;j++){
55             no_Pri[pri[j]*i]=true;
56             if(i%pri[j]==0)break;
57         }
58     }
59 }
60 int main(){
61     CalPri();
62     int n;
63     scanf("%d",&n);
64     dij.n=n+42;
65     dij.dijkstra(1);
66     printf("%d\n",dij.d[n]);
67     return 0;
68 }
时间: 2024-12-14 16:11:19

51nod 1693 水群(Dijkstra)的相关文章

51nod 1693 水群

基准时间限制:0.4 秒 空间限制:524288 KB 分值: 160 难度:6级算法题  收藏  关注 总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有意思的东西. 比如现在,bx2k就在研究怎样水表情的问题. 首先,bx2k在对话框中输入了一个表情,接下来,他可以进行三种操作. 第一种,是全选复制,把所有表情全选然后复制到剪贴板中. 第二种,是粘贴,把剪贴板中的表情粘贴到对话框中. 第三种,是退格,把对话框中的最后一个表情删去. 假设当前对话框中的表情数是num0

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来说,学到一点东西也是有用的.   但是现实还是有点残酷,啥都不懂,真心有点慌,现在开始有点担心自己会不会被刷掉,第一

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

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