hdu 4294 数学分析+搜索
又要开始一段搜索的路程了。
最近看了这题,在网上看到一个结论,任何一个数倍数都能被不超过两个数字组成,假如一个数n个A%x=b,那么必然有m个A%=b那么此时n个A减去m个B就能够被x整除,那么此时就有了上述的结论,在配合上余数来进行一个搜索,就是把余下的数字作为一个状态来进行广搜。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using std::queue;
int const N = ;
int const M = ;
int cnt[M],father[M],record[M];
char ans[M],tmp[M];
int n,k,a1,t1,e[N],c;
bool bfs()
{
queue<int> q;
while(!q.empty())q.pop();
for(int i=;i<c;i++)
{
if(!e[i]||cnt[e[i]%n])continue;
cnt[e[i]%n]=;
father[e[i]%n]=-;
record[e[i]%n]=e[i];
q.push(e[i]%n);
}
while(!q.empty())
{
int num=q.front();
q.pop();
if(a1>&&cnt[num]>a1)return false;
if(num==)return true;
for(int i=;i<c;i++)
{
int nt=(num*k+e[i])%n;
if(!cnt[nt])
{
cnt[nt]=cnt[num]+;
father[nt]=num;
record[nt]=e[i];
q.push(nt);
}
}
}
return false;
}
bool cmp()
{
if(a1==)return true;
if(t1>a1)return false;
if(t1<a1)return true;
for(int i=;i<t1;i++)
{
if(ans[i]>tmp[i])return true;
if(ans[i]<tmp[i])return false;
}
return false;
}
void over()
{
for(int i=;i<t1;i++)
ans[i]=tmp[i];
ans[t1]='\0';
a1=t1;
}
void display(int i)
{
tmp[cnt[i]-]=record[i]+'';
if(father[i]!=-)
display(father[i]);
}
int main()
{
while(scanf("%d %d",&n,&k)!=EOF)
{
a1=;
for(int i=;i<k;i++)
{
memset(cnt,,sizeof(cnt));
e[]=i,c=;
if(bfs())
{
display();
t1=cnt[];
if(cmp())over();
}
}
if(a1==)
for(int i=;i<k;i++)
{
for(int j=;j<i;j++)
{
memset(cnt,,sizeof(cnt));
e[]=j,e[]=i,c=;
if(bfs())
{
display();
t1=cnt[];
if(cmp())over();
}
}
}
for(int i=;i<a1;i++)printf("%c",ans[i]);
printf("\n");
}
return ;
}
hdu 4294 数学分析+搜索的更多相关文章
- HDU 4294 Multiple(搜索+数学)
题意: 给定一个n,让求一个M,它是n个倍数并且在k进制之下 M的不同的数字最少. 思路: 这里用到一个结论就是任意两个数可以组成任何数的倍数.知道这个之后就可以用搜索来做了.还有一个问题就是最多找n ...
- hdu 4294(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4294 思路:题目的意思是说,给你n,k,则求出n的正整数倍数,使得这个数字在k进制下表示的时候需要的不 ...
- hdu 5468(莫比乌斯+搜索)
hdu 5468 Puzzled Elena /*快速通道*/ Sample Input 5 1 2 1 3 2 4 2 5 6 2 3 4 5 Sample Output Case #1: ...
- HDU 4499.Cannon 搜索
Cannon Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- HDU 1045 (DFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意:在不是X的地方放O,所有O在没有隔板情况下不能对视(横行和数列),问最多可以放多少个 ...
- HDU 1180 (BFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1180 题目大意:迷宫中有一堆楼梯,楼梯横竖变化.这些楼梯在奇数时间会变成相反状态,通过楼梯会顺便到达 ...
- HDU 2531 (BFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2531 题目大意: 你的身体占据多个点.每次移动全部的点,不能撞到障碍点,问撞到目标点块(多个点)的最 ...
- HDU 1026 (BFS搜索+优先队列+记录方案)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 题目大意:最短时间内出迷宫.迷宫里要杀怪,每个怪有一定HP,也就是说要耗一定时.输出方案. 解 ...
- HDU 1312 (BFS搜索模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1312 题目大意:问迷宫中有多少个点被访问. 解题思路: DFS肯定能水过去的.这里就拍了一下BFS. ...
随机推荐
- [Effective Objective-C 读书笔记] 第1章 几条基本写法 (2~5条)
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3575599.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- php中位运算的应用:货品的状态
效果如下图: 分析:用一个整数的二进制可以记录32状态 00000000 00000000 00000000 00000000 >>=0 从右往左保存这三个的状态: 精品选中,第一位设置 ...
- 队列(链式存储)C++模板实现
#include <iostream> using namespace std; //队列结点类 template <typename T> class QueueNode{ ...
- 对WebClient扩展自动解压缩页面
WebClient下载压缩网页时出现的全是乱码,可通过扩展来解决这个问题. public class MyWebClient : WebClient { protected override WebR ...
- Cassandra1.2文档学习(9)—— 数据写入
数据参考:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/manage_dml ...
- php获取汉字首字母的函数
本文介绍用php实现汉字转化为首字母的方法,主要功能是:功能明确,易于修改维护和扩展: 英文的字串:不变返回(包括数字):中文字符串:返回拼音首字符: 中英混合串: 返回拼音首字符和英文. 网上的方法 ...
- LNMP下防跨站、跨目录安全设置,仅支持PHP 5.3.3以上版本
PHP 5.3.3以上的版本,可以修改/usr/local/php/etc/php.ini在末尾里加入: [HOST=www.vpser.net] open_basedir=/home/wwwroot ...
- Python SqlAlchemy使用方法
1.初始化连接 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create ...
- 用shell查找某个目录下最大文件
网上资料学习: 1.查找当前目录下最大文件(包括子目录里文件): find . -type f -exec stat -c "%s %n" {} \; | sort -nr | h ...
- STL set_difference set_intersection set_union 操作
以下是STL algorithm的几个函数,使用的条件是有序容器,所以 vector在被sort了之后是可以使用的,set也是可以使用的. set_difference 这个是求得在第一个容器中有,第 ...