1. 给定$d,k$, 求最小的被$d$整除, 且各数位仅有$k$和$0$组成的数. $(1\le k\le 9,1\le n\le 1e6)$

从高位到低位$BFS$, BFS求出字典序最小的方案.

#include <iostream>
#include <cstdio>
#include <queue>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii; const int N = 1e6+10;
queue<int> q;
int d, k, vis[N];
pii pre[N]; void dfs(int x) {
if (pre[x].x!=-1) dfs(pre[x].x);
printf("%d", pre[x].y);
} int main() {
scanf("%d%d", &d, &k);
q.push(k%d);
vis[k%d] = 1;
pre[k%d] = pii(-1,k);
while (q.size()) {
int u = q.front(); q.pop();
for (int i=0; i<=k; i+=k) {
int v = (u*10+i)%d;
if (!vis[v]) {
vis[v] = 1;
pre[v] = pii(u,i);
q.push(v);
}
}
}
dfs(0),puts("");
}

2. 被$d$整除, 数位和为$s$的数. (CF 1070A)

#include <iostream>
#include <cstdio>
#include <queue>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii; queue<pii> q;
int d, s, vis[555][5050];
pii pre[555][5050]; void dfs(int x, int y) {
if (x||y) {
dfs(pre[x][y].x,pre[x][y].y);
printf("%d",y-pre[x][y].y);
}
} int main() {
scanf("%d%d", &d, &s);
q.push(pii(0,0));
vis[0][0] = 1;
while (q.size()) {
pii u = q.front(); q.pop();
REP(i,0,9) {
pii v((u.x*10+i)%d,u.y+i);
if (v.y<=s&&!vis[v.x][v.y]) {
q.push(v);
pre[v.x][v.y] = u;
vis[v.x][v.y] = 1;
}
}
}
if (!vis[0][s]) return puts("-1"),0;
dfs(0,s),puts("");
}

3. 给定$k$种浓度的水, 每种数量无限, 求混合为浓度$n$最少要多少杯.

容易发现答案序列$a_i$满足$\sum (a_i-n)=0$, 从而转化为$BFS$求最小环.

但是有一个问题是$\sum (a_i-n)$的范围, 测试一下发现只要保证每步都在$[-1000,1000]$一定最优, 考虑证明.

只需要证明 任意一个最优解均可通过重排, 使得每一步的和都在$[-1000,1000]$即可.

考虑一个最优方案, 假设当前的$s>0$, 考虑添加一个数$t>0$.

不合法当且仅当$s+t>1000$, 考虑调整后面负数的位置, 使得方案合法.

若剩余负数存在一个$x$,有$-x\ge t$, 那么直接转移为$s+x+t$即可.

否则剩余负数全在范围$[-t+1,0)$内.

并且剩余负数总和绝对值一定不少于$s+t$(合法方案保证总和为$0$).

这样的话不断选负数, 直到$s+\sum x + t \le 1000$, 这样一定合法.

这是因为调整过程中, 最坏情况是和变为$s+\sum x=1001-t$, 然后添加一个最小数得到$s+\sum x=1002-2t>-1000$, 满足条件.

所以结论成立.

#include <iostream>
#include <cstdio>
#include <queue>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std; const int N = 1e5+10;
int n, k, a[N];
int v[N], d[N], *dis = d+5010, *vis = v+5010;
queue<int> q; int main() {
scanf("%d%d", &n, &k);
REP(i,1,k) {
scanf("%d", a+i);
a[i] -= n;
if (vis[a[i]]) {
--i, --k;
continue;
}
vis[a[i]] = 1;
dis[a[i]] = 1;
q.push(a[i]);
}
while (q.size()) {
int u = q.front(); q.pop();
REP(i,1,k) {
int v = u+a[i];
if (abs(v)>1000) continue;
if (!vis[v]) {
vis[v] = 1;
dis[v] = dis[u]+1;
q.push(v);
}
}
}
printf("%d\n", vis[0]?dis[0]:-1);
}

BFS练习的更多相关文章

  1. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  2. 【BZOJ-1656】The Grove 树木 BFS + 射线法

    1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 186  Solved: 118[Su ...

  3. POJ 3278 Catch That Cow(bfs)

    传送门 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 80273   Accepted: 25 ...

  4. POJ 2251 Dungeon Master(3D迷宫 bfs)

    传送门 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 11 ...

  5. Sicily 1215: 脱离地牢(BFS)

    这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而 ...

  6. Sicily 1048: Inverso(BFS)

    题意是给出一个3*3的黑白网格,每点击其中一格就会使某些格子的颜色发生转变,求达到目标状态网格的操作.可用BFS搜索解答,用vector储存每次的操作 #include<bits/stdc++. ...

  7. Sicily 1444: Prime Path(BFS)

    题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ...

  8. Sicily 1051: 魔板(BFS+排重)

    相对1150题来说,这道题的N可能超过10,所以需要进行排重,即相同状态的魔板不要重复压倒队列里,这里我用map储存操作过的状态,也可以用康托编码来储存状态,这样时间缩短为0.03秒.关于康托展开可以 ...

  9. Sicily 1150: 简单魔板(BFS)

    此题可以使用BFS进行解答,使用8位的十进制数来储存魔板的状态,用BFS进行搜索即可 #include <bits/stdc++.h> using namespace std; int o ...

  10. ACM/ICPC 之 靠墙走-DFS+BFS(POJ3083)

    //POJ3083 //DFS求靠左墙(右墙)走的路径长+BFS求最短路 //Time:0Ms Memory:716K #include<iostream> #include<cst ...

随机推荐

  1. Redis企业实战的一些坑

    附录:Redis企业实战的一些坑 一.前言 小伙伴们对Redis应该不陌生,Redis是系统必备的分布式缓存中间件,主要用来解决高并发下分担DB资源的负载,从而提升系统吞吐量. Redis支持多种数据 ...

  2. RK3288 st7703 mipi屏指令过长,程序跑飞

    本文为博主原创文章,转载请注明出处:https://www.cnblogs.com/lialong1st/p/11218433.html CPU:RK3288 系统:Android 5.1 调试 mi ...

  3. windows通过企业内部授权服务器激活方法

    OFFICE KMS 激活方法: # 进入office安装目录 cscript ospp.vbs /sethst:kms.domain.com #设置KMS服务器 cscript ospp.vbs / ...

  4. sql数据库为null时候ASP语句判断问题

    我有一个表test1,有字段num,字段num有null值,也有空值,也有其他值,我要用asp语句判断我查询出来的num的值是否为null值.应该怎么写 严谨一点,要有两层判断: If IsNull( ...

  5. Linux 验证当前 Video0 不否是v4l设备 linux v4l 编程(1) Video 4 Linux 简介

    #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/types.h ...

  6. WGS84 2 GCJ-02

    #include ; ) { x=-x; ff=; } cc=) ff=; ) ff=; } x=tt; ss=x; s2=x; tt=tt*tt; s2=s2*tt; ss=ss-s2* ) ss= ...

  7. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_02-Eureka注册中心-搭建Eureka单机环境

    我们先搭建单机环境 govern是治理的意思, 这样就把工程创建好了 创建包 创建SpringBoot的启动类. 在父工程里面已经确定了Spring Cloud的版本了.相当于锁定了版本 接下里只需要 ...

  8. web手工项目04-测试报告的核心内容-HTTP请求和响应-fiddler工具进行抓包

    回顾 登录功能测试(需求分析(输入分析,处理分析,输出分析),数据构造,编写用例) 测试点设计思路--扩展(相关业务,特殊角度-分支,异常,逆向) 流程图元素与画法(开始/结束,路径,数据,判定,步骤 ...

  9. 123457123457#0#-----com.yuming.ZuiNiuChengYu--前拼后广--最牛成语

    com.yuming.ZuiNiuChengYu--前拼后广--最牛成语

  10. 我的iOS动画01

    1.嵌套使用,先变大再消失 [UIView animateWithDuration:1.25 aniamtions:^{ CGAffineTransform newTRansform = CGAffi ...