D : 数字变换的复仇(1313)

本文介绍了一个使用广度优先搜索(BFS)算法解决特定问题的例子。通过队列模拟操作,利用标记进行剪枝,有效避免重复计算并记录层级。代码实现了从起点到目标节点的最短路径计算。

题目链接:http://acm.xidian.edu.cn/problem.php?id=1313

  bfs用队列模拟操作,剪枝最重要的就是标记,若该数已经在之前的层中到达,则没必要在新的层中做继续操作,并且可以用这个标记来记录层数;(这是一个技巧,可以记住以后用,我也是学的别人的)

用一个数组,A[n] = k,n即为达到的数,k为所在层数,下一次操作为A[m] = A[n] + 1;

 1 #include<stdio.h>
 2 #include<queue>
 3 #include<memory.h>
 4 using namespace std;
 5 
 6 queue<int> Q;
 7 int vis[100005];
 8 int n, m;
 9 int bfs()
10 {
11     while(!Q.empty())
12     {
13         int temp = Q.front();
14         if(vis[temp + 1] == -1)
15         {
16             Q.push(temp + 1);
17             vis[temp + 1] = vis[temp] + 1;
18             if(temp + 1 == m)        return vis[m];
19         }
20         if(vis[temp - 1] == -1 && temp > 0)
21         {
22             Q.push(temp - 1);
23             vis[temp - 1] = vis[temp] + 1;
24             if(temp - 1 == m)        return vis[m];
25         }
26         if(temp * 2 <= 1e5 && vis[temp * 2] == -1 && temp > 0)
27         {
28             Q.push(temp * 2);
29             vis[temp * 2] = vis[temp] + 1;
30             if(temp *2 == m)        return vis[m];
31         }
32         Q.pop();
33     }
34 }
35 
36 
37 int main()
38 {
39     while(scanf("%d %d",&n, &m) != EOF)
40     {
41         while(!Q.empty())                    //清空队列很重要 
42             Q.pop();
43         memset(vis,-1,sizeof(vis));
44         if(n >= m)
45         {
46             printf("%d\n",n - m);
47             continue;
48         }
49         Q.push(n);
50         vis[n] = 0;
51         int result = bfs();
52         printf("%d\n",result);
53     }
54     return 0;
55 }

 

转载于:https://www.cnblogs.com/Dicer/p/9100935.html

叶铃盼望着复仇 . 你说冤冤相报何时了? 几乎被夺走一切的他可管不了那么多, 无论付出什么代价, 他将复仇 . 为了复仇, 他要打造一把好刀, 一笔勾销过去的错误. 从侧面叶铃的刀可以视作 [ 0 , 1 ) [0,1) 上的一个函数 f f, f ( x ) f(x) 表示刀在 x x 处的厚度 . 初始时 f ( x ) = 0 f(x)=0 有如下几种锻刀操作 . 锻造 1 pl ql pr qr v 将 f ( x ) , x ∈ [ p l q l , p r q r ) f(x),x∈[ ql pl ​ , qr pr ​ ) 加上 v v. 淬火 2 pl ql pr qr v 将 f ( x ) , x ∈ [ p l q l , p r q r ) f(x),x∈[ ql pl ​ , qr pr ​ ) 乘以 v v. 测量 3 pl ql pr qr 求 ∫ x = p l q l p r q r f ( x ) d x ∫ x= ql pl ​ qr pr ​ ​ f(x)dx 对 998244353 998244353 取模 . 如果你不了解 ∫ ∫ 符号, 可以看作正常的区间求和, 并参考样例理解. 输入格式 本题强制在线, 每次输入的 p l , q l , p r , q r , v pl,ql,pr,qr,v 需要异或上上一次的答案 l a s t a n s lastans. 初始 l a s t a n s = 0 lastans=0 . 输入文件第一行是一个数字 q q 表示操作次数 . 接下来 q q 行每行为题目中一项操作 . 输出格式 对于每一次测量, 输出一行包含一个整数, 表示这个询问的答案 . input1 复制 3 1 1 3 1 2 12 2 1 3 5 12 2 3 1 4 7 9 output1 复制 3 input2 复制 5 1 1 3 3 4 12 3 1 4 1 2 2 3 0 10 11 0 3 3 11 10 11 3 13 4 13 14 output2 复制 2 8 7 说明/提示 样例 1 中最后函数为 f ( x ) = 12 , x ∈ [ 1 3 , 5 12 ) f(x)=12,x∈[ 3 1 ​ , 12 5 ​ ) f ( x ) = 24 , x ∈ [ 5 12 , 1 2 ) f(x)=24,x∈[ 12 5 ​ , 2 1 ​ ) f ( x ) = 0 , o t h e r w i s e f(x)=0,otherwise 第一部分被完全覆盖, 贡献了 ( 5 12 − 1 3 ) × 12 = 1 ( 12 5 ​ − 3 1 ​ )×12=1. 第二部分被完全覆盖, 贡献了 ( 1 2 − 5 12 ) × 24 = 2 ( 2 1 ​ − 12 5 ​ )×24=2. 求和为 3 3. 1 ≤ q ≤ 2 × 10 5 , 1 ≤ p l , q l , p r , q r , v < 998244353 1≤q≤2×10 5 ,1≤pl,ql,pr,qr,v<998244353. (解密后) 出现的分数均为既约分数, 且满足 0 < p q < 1 0< q p ​ <1.c++,注意所有分子均为1
08-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值