『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,有几点要注意一下 注意:如果数字有加号要删除掉,这里用到了正则表达式“\\+” ...
随机推荐
- vue支付密码
从网上搜索了好多都很麻烦,花了点事件自己做了个,简单轻便,老少皆宜 <template> <section class="pay-mask" @click=&qu ...
- JS原生隐藏显示图片,点击切换图片的效果
今天要说的内容,看标题就都能知道了!所有知识点一览无遗啊!咱们今天的东西,是纯纯的原生JS代码, 我先说一下要求, 1.有两个按钮,内容为显示,和换, 2.当点击显示的时候,按钮文字变成隐藏,同时图片 ...
- 002服务提供者Eureka
1.POM配置 和普通Spring Boot工程相比,仅仅添加了Eureka.Spring Boot Starter Actuator依赖和Spring Cloud依赖管理 <dependenc ...
- [小北De编程手记] : Lesson 04 - Selenium For C# 之 API 上
这一部分,我准备向大家介绍Selenium WebDriver的常用API,学习这部分内容需要大家最好有一些简单的HTML相关知识,本文主要涉及到以下内容: Selenium API:元素检查 Sel ...
- Linux下C语言操作MySQL数据库
MySQL是Linux系统下广泛使用的开源免费数据库,是Linux应用程序数据存储的首选. Ubuntu下安装 […]
- nginx https 连接加密
##HTTPS server##server {listen 443;server_name www.shabi.com;ssl on;index index.php index.html index ...
- 使用 Azure CLI 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager 部署模型
以下步骤演示如何使用 Azure 命令行接口 (CLI) 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 本文中的操作需要 Az ...
- MySQL5.7的组提交与并行复制
从MySQL5.5版本以后,开始引入并行复制的机制,是MySQL的一个非常重要的特性. MySQL5.6开始支持以schema为维度的并行复制,即如果binlog row event操作的是不同的sc ...
- zt 设计模式六大原则(3):依赖倒置原则
下面说法对不对? 父类将算法(逻辑)封装起来,子类实现细节:这个就叫DIP(依赖倒置:Dependency Inversion Principles),模板模式就是这个原则的实现.如果在父类中加一个t ...
- 使用ViewPager和FragmentPagerAdapter实现Tab
前面我们分别利用ViewPager和Fragment实现了Tab效果.但是使用Fragment实现的Tab不能够左右滑动.如果我们既想使用Fragment又想让Tab能够滑动,那么怎么办呢?这 就是今 ...