HDU 1104 Remainder (BFS求最小步数 打印路径)
题意 : 给你N,K,M,N可以+,- ,*,% M,然后变为新的N,问你最少几次操作能使(原来的N+1)%K与(新的N)%k相等。并输出相应的操作。
思路 : 首先要注意题中给的%,是要将负数变为正数的,所以取余的时候要注意,又因为各种问题……
% 的问题是:a mod b = (a % b + b) % b,不是平常的取余。
讨论里有个人是这样说的:
关于此题的用bfs搜索,大家都是知道的。
既然使用了bfs,则队列是少不了的,为了叙述的方便,记运算符集合
oper = {+,-,*,%}, op = {+,-,*}, pe = {+,-,%}。
N在经过一些列的运算,可能会很大,所以溢出问题,需要考虑充分。
因为最后比较的是两个数对k取余是否相等,因此,在队列中存储对
k取余后的值,各种文章中谈论的都是
((n oper m)%k oper m)%k 是不是等于(n oper m oper m)%k
对于op运算是成立的,但是%参与时,结果是不等。例如:
记n = 2, m = 8, k =3.
则((n * m)%k % m)%k = 1
而(n * m % m)%k = 0。
关于另一个结论:%只能出现在第一个位置或者出现在*的后面,且%最多只能出现两次。
因为对任意n,( n pe m ) % m = n % m. 对于乘法则是不一定的,n * m % m 必为0。
由于一系列{+,-,%}运算相当于在n的基础上,‘+’相当于加上若干个m,‘-’相当于减去若干
个m,‘%’相当于一次同时减去(或者加上)若干个m。而他们的总和带来的结果就是n的变化是
m的整数倍,所以上面的式子相等。也就是说如果有一个序列中有‘%’,则它的前面要么是空的,
要么是‘*’,因为如果是其他的只会使得操作序列更长。例如:
+-+-+++%+*+-*-*可以变成%+*+-*-*,后者比前者更短。
*%+-+-***-+*%+*这样的路径也是不存在的,因为*%使得n为0,而后面的*%也为0,
重复,所以不会入队列的。
因为‘%’出现的情况很有限,并且出现的位置,也可以知道。特殊处理一下,就可以了。其他的
对k取余没有问题。
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <queue>
using namespace std ; struct node
{
int step ;
int an ;
string ch ;
} p,q,temp;
int vis[] ;
int n,m,k,km ;
void bfs()
{
queue<node>Q ;
memset(vis,,sizeof(vis)) ;
p.an = (n % km) + km ;
vis[p.an] = ;
p.step = ;
Q.push(p) ;
while(!Q.empty())
{
q = Q.front();
Q.pop();
if(q.an % k == ((n + ) % k + k)%k )
{
printf("%d\n",q.step) ;
cout<<q.ch<<endl;
return ;
}
int x = q.an;
temp.step = q.step + ;
for(int i = ; i < ; i++)
{
if(i == )
{
temp.an = (x+m) % km;
temp.ch = q.ch+'+' ;
}
else if(i == )
{
temp.an = ((x-m)%km+km)%km;
temp.ch = q.ch+'-' ;
}
else if(i == )
{
temp.an = (x*m)%km;
temp.ch = q.ch+'*' ;
}
else if(i == )
{
temp.an = (x%m)%km;
temp.ch = q.ch+'%' ;
}
if(!vis[temp.an])
{
Q.push(temp) ;
vis[temp.an] = ;
}
}
}
printf("0\n") ;
} int main()
{ while(~scanf("%d %d %d",&n,&k,&m))
{
if(n == && m == && k == ) break ;
km = k*m ;
bfs() ;
}
return ;
}
HDU 1104 Remainder (BFS求最小步数 打印路径)的更多相关文章
- HDU 1104 Remainder(BFS 同余定理)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1104 在做这道题目一定要对同余定理有足够的了解,所以对这道题目对同余定理进行总结 首先要明白计算机里的 ...
- hdu - 1104 Remainder (bfs + 数论)
http://acm.hdu.edu.cn/showproblem.php?pid=1104 注意这里定义的取模运算和计算机的%是不一样的,这里的取模只会得到非负数. 而%可以得到正数和负数. 所以需 ...
- HDU 1104 Remainder (BFS(广度优先搜索))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDU 1104 Remainder( BFS(广度优先搜索))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)
题目链接 题意:4*4的黑白棋,求把棋全变白或者全变黑的最小步数. 分析:以前用状态压缩做过. 和上题差不多,唯一的不同是这个终态是黑棋或者白棋, 但是只需要把给的初态做不同的两次处理就行了. 感觉现 ...
- ZOJ 3593 One Person Game(拓展欧几里得求最小步数)
One Person Game Time Limit: 2 Seconds Memory Limit: 65536 KB There is an interesting and simple ...
- One Person Game(扩展欧几里德求最小步数)
One Person Game Time Limit: 2 Seconds Memory Limit: 65536 KB There is an interesting and simple ...
- hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- HDU 1104 Remainder (BFS)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1104 题意:给你一个n.m.k,有四种操作n+m,n-m,n*m,n%m,问你最少经过多少步,使得最后 ...
随机推荐
- 安装nagios检测hadoop
Nagios是常用的系统监控工具,提供了很多基本服务的监控脚本,如HTTP,MYSQL等,同时具有不错的可扩展性,自己可定制针对特定参数的监控脚本以及报警的方式. 我现在有三台机器:192.168.0 ...
- ansible之感冒药
Ansible简介安装 Ansible是一个综合的强大的管理工具,他可以对多台主机安装操作系统,并为这些主机安装不同的应用程序,也可以通知指挥这些主机完成不同的任务.查看多台主机的各种信息的状态等,a ...
- web页面取用户控件页面中服务器控件的值
用户控件页面后台: public string P_Name { get { return txt_P_name.Value; } set { txt_P_name.Value = value; } ...
- java程序中的ibatis连接mySql的基本实例
属性文件:SqlMap.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/ibatis username= ...
- Mysql Cluster节点类型(转载)
mysql 自4.1.x版本开始推出mysql cluster功能.cluster简单地说,就是一组"节点"的组合.这里的节点是一个逻辑概念,一台计算机上可以存放一个节点,也可以存 ...
- jQuery样式与动画
修改内联CSS .css() 获取 //取得单个属性的值,传入'属性名',返回"value" .css('property') //取得多个属性的值,传入'['属性1','属性2' ...
- 【转】Android 中处理崩溃异常并重启程序出现页面重叠的问题
原文地址:http://blog.csdn.net/jiang547860818/article/details/53641113 android开发中经常会遇到程序异常,而已常常会遇到一出现异常AP ...
- Android屏幕相关概念和适配方法
参考文档: 1.http://blog.csdn.net/carson_ho/article/details/51234308(略有修改) 2.http://www.cnblogs.com/cheng ...
- Django学习---ajax
Ajax 应用场景:我们在输入表单进行提交的时候往往会判断输入的数据形式是否正确,这个时候如果我们点击了提交就会刷新页面.如果我们不想要它刷新页面,让它“悄悄的提交数据”,这个时候我们就需要使用aja ...
- K老在拿图灵奖时的发言:Computer Programming as an Art
很多话说得很透彻,把一些觉比较精彩的摘抄一下. ... It seems to me that if the authors I studied were writing today, they wo ...