Gym101889E. Enigma(bfs+数位)
比赛链接:传送门
题目大意:
求一个十进制大数S(有部分数位为"?")能被N整除时的最小值,如果没有办法被N整除,输出"*"。
思路:
一个数位上的数值增加1后,对N取模时的贡献可以预处理出来。设为mod[MAX_N]。
先把整个十进制大数置成最小的合法状态,存在res中。(问号置为0或1)
此时的大数对N取模的值是可以计算的。设为val。
如果val为0,res中已经是最大的答案。
如果val不为0,从最右边的"?"开始往左枚举"?"。
维护一个vis数组,vis[k] = true表示已经访问过的问号当中,至少有一种填法使得整个大数对N取模的余数为k。
如果vis[N-val] = true,说明找到了一种填法。因为是从右往左枚举"?"的,第一次得到vis[N-val] = true时,几乎就是最小的了。考虑到当前数位填的数相同时,可能在当前的"?"右边的"?"填数不同,可能导致最小值不同,所以要额外judge一下。更新vis数组时,记录路径,在vis[N-val] = true时,反演路径,对应修改res中对应数位的数值即可。
代码:
#include <bits/stdc++.h> using namespace std;
const int MAX_N = + ;
const int INF = 0x3f3f3f3f; int N;//取模
int len;//S的长度
char S[MAX_N], res[MAX_N];
int mod[MAX_N];//数位取模的值
int val;//work构造模N为val的值
bool vis[MAX_N], tmpvis[MAX_N];//vis[i]能否构造模N为i的值
int fat[MAX_N], fatnum[MAX_N], fatlog[MAX_N];//记录路径 inline bool judge(int pos, int l, int n, int f)
{
if (l == fatlog[fat[pos]]) {
return n < fatnum[fat[pos]];
}
return l < fatlog[fat[pos]];
} bool work()
{
memset(vis, false, sizeof vis);
vis[] = true;
fat[] = -;
fatnum[] = ;
fatlog[] = ;
if (vis[val])
return true; for (int i = ; i <= len; i++) {
int p = len-i;
if (isdigit(S[p]))
continue;
memcpy(tmpvis, vis, sizeof vis);
for (int j = +(i==len); j <= ; j++) {
for (int k = ; k < N; k++) if(vis[k]) {
int pos = ( k+mod[i]*(j - (i==len)) )%N;
if (!tmpvis[pos] || judge(pos, i, j, k)) {
tmpvis[pos] = true;
//可能同时有很多边找到了?不可能。
fat[pos] = k;
fatnum[pos] = j;
fatlog[pos] = i;
}
}
if (tmpvis[val])
return true;
}
memcpy(vis, tmpvis, sizeof vis);
}
return false;
} int main()
{
// freopen("testdata.txt", "r", stdin);
while (~scanf("%s%d", S, &N)) { len = strlen(S);
mod[] = %N;
for (int i = ; i <= len; i++) {
mod[i] = mod[i-]*%N;
} val = ;
for (int i = ; i <= len; i++) {
int p = len-i;
res[p] = S[p];
if (isdigit(S[p])) {
val += (S[p]-'')*mod[i]%N, val %= N;
}
else if (S[p] == '?') {
if (i == len) {
val += mod[i]%N, val %= N;
res[p] = '';
}
else {
res[p] = '';
}
}
}
val = (N-val)%N;
res[len] = '\0';
// printf("%s\n", res); bool ans = work();
if (!ans) {
puts("*");
continue;
} int tmp = val;
while (fat[tmp] != -) {
int f = fat[tmp];
int l = fatlog[tmp];
int n = fatnum[tmp];
int pos = len-l;
res[pos] = n + '';
tmp = f;
}
// printf("%s\n", S);
printf("%s\n", res);
// puts("");
}
return ;
}
/*
1??????????????????????????????? 2 ???????????????????????????????1 2 ?294?? 17 9999??????? 81
*/
Gym101889E. Enigma(bfs+数位)的更多相关文章
- Gym - 101889E Enigma(数位填数+记忆化)
https://cn.vjudge.net/problem/Gym-101889E 1??????????????????????????????? 2 10000000000000000000000 ...
- 【数位dp】Enigma
http://codeforces.com/gym/101889 E 与一般数位dp不同,保存的是能否满足条件,而非记录方案数 代码: #include <iostream> #inclu ...
- hdu3709 Balanced Number (数位dp+bfs)
Balanced Number Problem Description A balanced number is a non-negative integer that can be balanced ...
- 【每日dp】 Gym - 101889E Enigma 数位dp 记忆化搜索
题意:给你一个长度为1000的串以及一个数n 让你将串中的‘?’填上数字 使得该串是n的倍数而且最小(没有前导零) 题解:dp,令dp[len][mod]为是否出现过 填到第len位,余数为mod 的 ...
- BFS+状态压缩 hdu-1885-Key Task
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...
- hdu1429之BFS
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 搜索入门_简单搜索bfs dfs大杂烩
dfs题大杂烩 棋盘问题 POJ - 1321 和经典的八皇后问题一样. 给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...
- HDU 1226 超级密码(数学 bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1226 超级密码 Time Limit: 20000/10000 MS (Java/Others) ...
- HDU 1043 Eight 【经典八数码输出路径/BFS/A*/康托展开】
本题有写法好几个写法,但主要思路是BFS: No.1 采用双向宽搜,分别从起始态和结束态进行宽搜,暴力判重.如果只进行单向会超时. No.2 采用hash进行判重,宽搜采用单向就可以AC. No.3 ...
随机推荐
- JS设计模式(10)职责链模式(重要)
什么是职责链模式? 重要性:4 星,在项目中能对 if-else 语句进行优化 定义:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到 ...
- Mac 配置教程-开发篇
将 Mac 日常使用的软件和开发软件区分开,将之前写的 Mac 配置的文章分成了两篇: Mac 配置教程-日常篇 Mac 配置教程-开发篇 图床 iPic 设置快捷键 Command+Shift+u ...
- Win32汇编学习(11):对话框(2)
我们将进一步学习对话框,探讨如何把对话框当成输入设备.如果您看了前一篇文章,那就会发现这次的例子只有少量的改动,就是把我们的对话框窗口附属到主窗口上.另外,我们还要学习通用对话框的用法. 理论: 把对 ...
- ffmpeg 图像转视频 视频转图像
ffmpeg使用 以下两条可使用,具体可参考:https://blog.csdn.net/pkueecser/article/details/8555261pic to video:ffmpeg -f ...
- CSS布局学习(三) - Normal Flow 正常布局流(官网直译)
默认情况下,元素是如何布局? 首先,取得元素的内容,加上内边距(padding),边框(border),外边距(margin)放在一个盒子中 - 这就是我们之前看到的盒子模型 默认情况下,块级元素的内 ...
- npm使用国内镜像的方法
一.通过命令配置1. 命令 npm config set registry https://registry.npm.taobao.org 2. 验证命令 npm config get registr ...
- js时间戳转化成日期格式
function timestampToTime(timestamp) { var date = new Date(timestamp * 1000);//时间戳为10位需*1000,时间戳为13位的 ...
- 第二周javaweb学习进度表
第一周 所花时间 三天 代码量 200行 博客量 3篇 知识点了解到的 学习到了HTML编程语言的相关知识比如checkbox复选框和radio单选按钮以及form表单的使用方法,form表单可以 ...
- HTTP 协议(一)之基本概念入门
一.网络基础 TCP/IP 计算机与网络设备要相互通信,双方就必须基于相同的方法. TCP/IP 协议族按层次分别分为以下 4层:应用层.传输层.网络层和数据链路层. 应用层: 决定了向用户提供应用服 ...
- Docker部署Django项目+Nginx+Fluend日志收集 和redis、memcached、RabbitMQ、Celery
前言 一.docker 1.docker是什么? Docker的英文本意是“搬运工”,Docker搬运的是集装箱(Container)可以成为容器,我可以把写的Django的WEB应用以及Python ...