HDU - 4474 bfs好题
2024-09-01 19:09:03
这个BFS并不是很好想。。 最主要的一点是每个余数只会被拿出来一次更新其他余数, 然后我用d[ i ]表示
到达 i 这个余数最短需要多长,然后从高位往低位贪心,判断成立的时候忘记了如果0被ban掉了这个判断会
出问题,都想到这里了为什么没有想到直接去bfs找答案呢??? 我TM蠢爆。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PII pair<int, int>
using namespace std; const int N = 2e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ; int n, m, tot, vis[N], from[N], who[N], ans[N];
bool is[];
void init() {
tot = ;
memset(vis, , sizeof(vis));
memset(is, , sizeof(is));
}
int main() {
int cas = ;
while(scanf("%d%d", &n, &m) != EOF) {
init();
for(int i = ; i <= m; i++) {
int x; scanf("%d", &x);
is[x] = true;
}
queue<int> que;
for(int i = ; i < ; i++) {
if(is[i]) continue;
if(i%n==) {
ans[tot++] = i;
break;
}
vis[i%n] = ;
from[i%n] = ;
who[i%n] = i;
que.push(i%n);
}
if(!tot) {
while(!que.empty() && !tot) {
int u = que.front(); que.pop();
for(int i = ; i < ; i++) {
if(is[i]) continue;
int v = (u*+i)%n;
if(!v) {
ans[tot++] = i;
while(u) {
ans[tot++] = who[u];
u = from[u];
}
reverse(ans, ans + tot);
break;
}
if(vis[v]) continue;
vis[v] = vis[u] + ;
from[v] = u;
who[v] = i;
que.push(v);
}
}
}
printf("Case %d: ", cas++);
if(!tot) puts("-1");
else {
for(int i = ; i < tot; i++)
printf("%d", ans[i]);
puts("");
}
}
return ;
} /*
*/
最新文章
- JDBC MySQL 多表关联查询查询
- swift 手机号码正则表达式 记录一下
- 12款经典的白富美型—jquery图片轮播插件—前端开发必备
- IIS 的一些配置记录
- Clappr——开源的Web视频播放器
- linux tricks 之 roundup.
- synchronized和static synchronized的比较
- Intent的4种传值方法总结
- redis的key过期时间
- 如何判断C#的Finalizer线程有没有被阻塞
- 删除workspace下的vss的scc文件
- Winform自定义控件在界面上拖动、滚动鼠标。。会闪烁的解决方法
- Android四大组件详解
- ASP.NET根据当前时间获取,本周,本月,本季度等时间段
- Java调用WebService就是这么简单
- Scala 入门介绍
- rabbitmq基础学习+springboot结合rabbitmq实现回调确认confirm
- find,xargs,tar有选择打包
- JS深拷贝/深克隆(面试用)
- 【小白的CFD之旅】23 串行与并行