『ACM C++』HDU杭电OJ | 1416 - Gizilch (DFS - 深度优先搜索入门)
从周三课开始总算轻松了点,下午能在宿舍研究点题目啥的打一打,还好,刚开学的课程还算跟得上,刚开学的这些课程也是复习以前学过的知识,下半学期也不敢太划水了,被各种人寄予厚望之后瑟瑟发抖,只能努力前行了~自己好多地方还做得不够好,真的是要提升的方面太多了,加油吧~
今日兴趣新闻:
网易回应裁员:公司确实正在进行结构性优化
链接:https://baijiahao.baidu.com/s?id=1626619207432301200&wfr=spider&for=pc
偶尔反新闻经常看到这些大公司的裁员,谷歌、微软、华为、百度都出现过大幅度的裁员,现在网易也开始了,这会不会加剧了未来毕业职业出口的紧张呢?
------------------------------------------------题目----------------------------------------------------------
Gizilch
Problem Description
Inevitably, though, disputes arise, and so the official winner is not
determined until the disputes are resolved. The player who claims the lower
score is entitled to challenge his opponent's score. The player with the lower
score is presumed to have told the truth, because if he were to lie about his
score, he would surely come up with a bigger better lie. The challenge is upheld
if the player with the higher score has a score that cannot be achieved with
grapes not eaten by the challenging player. So, if the challenge is successful,
the player claiming the lower score wins.
So, for example, if one player
claims 343 points and the other claims 49, then clearly the first player is
lying; the only way to score 343 is by eating grapes labeled 7 and 49, and the
only way to score 49 is by eating a grape labeled 49. Since each of two scores
requires eating the grape labeled 49, the one claiming 343 points is presumed to
be lying.
On the other hand, if one player claims 162 points and the
other claims 81, it is possible for both to be telling the truth (e.g. one eats
grapes 2, 3 and 27, while the other eats grape 81), so the challenge would not
be upheld.
Unfortunately, anyone who is willing to referee a game of
gizilch is likely to have himself consumed so many grapes (in a liquid form)
that he or she could not reasonably be expected to perform the intricate
calculations that refereeing requires. Hence the need for you, sober programmer,
to provide a software solution.
Input
single line, that are claimed scores from a game of gizilch.
Output
assuming that the player with the lower score always challenges the outcome.
Sample Input
Sample Output
------------------------------------------------题目----------------------------------------------------------
(一) 原题大意:
原意说的是有一到一百个葡萄,有两个人去吃这些葡萄,每个葡萄上面有数字,每个人吃到的葡萄乘积之和就是自己的答案,获得最大的数就是胜利,但有人为了胜利会假报自己的数字,让你去识破他。
简单来说,就是一个游戏:
有两个人玩游戏A、B人,A和B都报一个数,其中最大的人是被挑战者,最小的那个人是挑战者,然后两人的数通过因式分解,若挑战者中总存在一种分解,是被挑战者总有的因子,那么说明被挑战者说谎,判挑战者胜利。
举例:
A = 343 B = 49 显然A>B,那么A是被挑战者,B是挑战者,正常来说较小的人不说假话,因为如果他要说假话为何不往大的数说呢,好让自己赢。
所以对A、B进行因式分解,对于B来说,你只能吃49才能得到,所以A不能再使用49了,但是A可以因式分解成49 * 7,所以可以看得出来A说了假话,判B胜利~
(二) 题目分析:
这道题有点小难度对于新手的我来说,查阅了一些解法加之自己的理解,是需要用到递归的DFS深搜方法去实现的。
首先建立一个数组,用来存储100个葡萄,value为0则说明还没被吃,1说明已经吃过不能再吃了,通过这种方法来判断A、B是否有因子重复。
然后对挑战者进行因式分解,得到挑战者的因式分解,然后再对被挑战者进行因式分解,如果被挑战者能够顺利的因式分解,那么被挑战者获胜,否则挑战者获胜。
后面我会简单整理一下深搜笔记~
(三) 代码分块:
第一步:分清挑战者和被挑战者:
if(a>b)
{
attacker = b;
victim = a;
}
else
{
attacker = a;
victim = b;
}
第二步:对挑战者进行因式分解:
result_dfs = dfs(attacker);
这里需要自己定义dfs深搜函数,那么下面开始定义深搜dfs:
第三步:dfs函数构造:分解因式:
if(number > ) size = ;
else size = number; for(i = ; i<= size ; i++)
{
if( number %i == && already[i] == )
{
already[i] = ;
if(dfs( number / i ) == ) return ;
already[i] = ;
}
}
第四步:dfs函数构造:判断挑战者和被挑战者的因式分解情况:
if(number == )
{
if(vic_divided == )
{
vic_divided = ;
vic_divide = ;
if(dfs(victim) == ) return ;
else{
vic_divided = ;
return ;
}
}
return ;
}
第五步,根据dfs返回的结果判断胜负:
if(vic_divided == && result_dfs == || vic_divide == ) winner = victim;
else winner = attacker;
(四) AC代码:
#include<stdio.h>
#include<string.h> int attacker,victim;
int vic_divided,vic_divide;
int already[]; int dfs(int number)
{
int i,size; if(number == )
{
if(vic_divided == )
{
vic_divided = ;
vic_divide = ;
if(dfs(victim) == ) return ;
else{
vic_divided = ;
return ;
}
}
return ;
} if(number > ) size = ;
else size = number; for(i = ; i<= size ; i++)
{
if( number %i == && already[i] == )
{
already[i] = ;
if(dfs( number / i ) == ) return ;
already[i] = ;
}
}
return ;
} int main()
{
int a,b,result_dfs,winner;
while(scanf("%d %d",&a,&b) != EOF)
{
vic_divide = vic_divided = ;
memset(already, , sizeof(already));
if(a>b)
{
attacker = b;
victim = a;
}
else
{
attacker = a;
victim = b;
} result_dfs = dfs(attacker); if(vic_divided == && result_dfs == || vic_divide == ) winner = victim;
else winner = attacker; printf("%d\n",winner);
}
return ;
}
(五)AC截图:
(六) 解后分析:
这道题用到了深搜,即深度优先搜索,简称DFS,对应的还有BFS,广度优先搜索。
事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
如果我们从A点发起深度优先搜索(以下的访问次序并不是唯一的,第二个点既可以是B也可以是C,D),则我们可能得到如下的一个访问过程:A->B->E(没有路了!回到A)->C->F->H->G->D(没有路,最终回到A,A也没有未访问的相邻节点,本次搜索结束)
参考:https://baike.baidu.com/item/深度优先搜索/5224976
做了几道题之后,简单悟到一些使用BFS、DFS的一些方式,但还很浅显,需要加强题量练习提升自己:
=》BFS是用来搜索最短径路的解是比较合适的,比如求最少步数的解,最少交换次数的解。
=》DFS不需要保存搜索过程中的状态,而BFS在搜索过程中需要保存搜索过的状态,而且一般情况需要一个队列来记录。
=》DFS适合搜索全部的解,因为要搜索全部的解,那么BFS搜索过程中,遇到离根最近的解,并没有什么用,也必须遍历完整棵搜索树,DFS搜索也会搜索全部,但是相比DFS不用记录过多信息,所以搜素全部解的问题,DFS显然更加合适。
注:我还是个渣渣辉,代码可能写得不够高效不够好,我也会努力优化,如果有更好的解法,真心希望您能够评论留言贴上您的代码呢~互相帮助互相鼓励才能成长鸭~~
『ACM C++』HDU杭电OJ | 1416 - Gizilch (DFS - 深度优先搜索入门)的更多相关文章
- 『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)
今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧 ...
- 『ACM C++』HDU杭电OJ | 1418 - 抱歉 (拓扑学:多面体欧拉定理引申)
呕,大一下学期的第一周结束啦,一周过的挺快也挺多出乎意料的事情的~ 随之而来各种各样的任务也来了,嘛毕竟是大学嘛,有点上进心的人多多少少都会接到不少任务的,忙也正常啦~端正心态 开心面对就好啦~ 今天 ...
- 『ACM C++』HDU杭电OJ | 1425 - sort (排序函数的特殊应用)
今天真的是累哭了,周一课从早八点半一直上到晚九点半,整个人要虚脱的感觉,因为时间不太够鸭所以就回头看看找了一些比较有知识点的题来总结总结分析一下,明天有空了就开始继续打题,嘻嘻嘻. 今日兴趣电影: & ...
- C#利用POST实现杭电oj的AC自动机器人,AC率高达50%~~
暑假集训虽然很快乐,偶尔也会比较枯燥,,这个时候就需要自娱自乐... 然后看hdu的排行榜发现,除了一些是虚拟测评机的账号以外,有几个都是AC自动机器人 然后发现有一位作者是用网页填表然后按钮模拟,, ...
- 用python爬取杭电oj的数据
暑假集训主要是在杭电oj上面刷题,白天与算法作斗争,晚上望干点自己喜欢的事情! 首先,确定要爬取哪些数据: 如上图所示,题目ID,名称,accepted,submissions,都很有用. 查看源代码 ...
- 爬取杭电oj所有题目
杭电oj并没有反爬 所以直接爬就好了 直接贴源码(参数可改,循环次数可改,存储路径可改) import requests from bs4 import BeautifulSoup import ti ...
- 杭电oj 2095 & 异或^符号在C/C++中的使用
异或^符号,在平时的学习时可能遇到的不多,不过有时使用得当可以发挥意想不到的结果. 值得注意的是,异或运算是建立在二进制基础上的,所有运算过程都是按位异或(即相同为0,不同为1,也称模二加),得到最终 ...
- 杭电oj 4004---The Frog Games java解法
import java.util.Arrays; import java.util.Scanner; //杭电oj 4004 //解题思路:利用二分法查找,即先选取跳跃距离的区间,从最大到最小, // ...
- 杭电oj————2057(java)
question:A+ B again 思路:额,没啥思路/捂脸,用java的long包里的方法,很简单,只是有几次WA,有几点要注意一下 注意:如果数字有加号要删除掉,这里用到了正则表达式“\\+” ...
随机推荐
- Java Jsp使用
1.Jsp基础 1)Jsp的执行过程 tomcat服务器完成:jsp文件->翻译成java文件->编译成class字节码文件-> 构造类对象-> 调用方法 tomcat的wor ...
- Python基础-进程和线程
一.进程和线程的概念 首先,引出“多任务”的概念:多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务.Linux.windows就是支持多任务的操作系统,比起单任务系统它的 ...
- 在WinServer上安装小红伞杀毒软件的经验总结
作者:朱金灿 来源:http://blog.csdn.net/clever101 在WinServer2008或WinServer2012不能直接安装小红伞杀毒软件的免费版,需要安装服务器版.我手头并 ...
- Python学习系列-----第二章 操作符与表达式
2.1 数学运算和赋值的简便方法 例如: 2.2 优先级 在python中运算符有优先级之分,高优先级的运算符先执行,低优先级的运算符后执行.下面是运算符优先级:(同一行的运算符具有相同的优先级) 2 ...
- 网站的Information Architecture--构建一个最优用户体验的site structure
http://conversionxl.com/website-information-architecture-optimal-user-experience/ 在网站上应该有什么类型的conten ...
- Linux ->> scp命令复制对端机器上的文件/文件夹
scp是secure copy的简写,用于在Linux下从远程机器拷贝文件. 特点: 传输是加密的,稍微影响了一下速度.而相比较rsync,它对于资源的占用还是有优势的. 用法 scp [参数] [原 ...
- MYSQL连接相关参数和状态值详解
针对mysql的连接参数和状态值,本文做些介绍和对比 一.MYSQL连接参数变量 1.常用连接数限制参数 show variables like '%connect%'; | max_connect_ ...
- ubuntu14.04server版安装redis
此博客记录首次在ubuntu14.04上安装redis过程. 以下采用两种方式进行安装 方法一:进入redis的官网下载(地址:https://redis.io/download)目前版本为4.0.9 ...
- 023re模块(正则)
之前我刚学的python知识点,没有题目进行熟悉,后面的知识点会有练习题,并且慢慢补充.看到很多都是很简单的练习,碰到复杂.需要运用的再补充吧#字符串中使用到正则表达式 s='hello world' ...
- getResource和getResourceAsStream
1. 前言 在Java中获取资源的时候,经常用到getResource和getResourceAsStream,本文总结一下这两种获取资源文件的路径差异. 2.Class.getResource(St ...