『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,有几点要注意一下 注意:如果数字有加号要删除掉,这里用到了正则表达式“\\+” ...
随机推荐
- 按需引入antd
使用create-react-app创建项目的时候,官网推荐使用 babel-plugin-import 对antd 按需引入文件.但是配置文件在项目里没有. 可以直接在package.json里加上 ...
- 归并排序算法Matlab实现
Matlab一段时间不用发现有些生疏了,就用归并排序来练手吧.代码没啥说的,百度有很多.写篇博客,主要是记下matlab语法,以后备查. 测试代码 srcData = [1,3,2,4,6,5,8 ...
- Spring boot 使用WebAsyncTask处理异步任务
上文介绍了基于 @Async 注解的 异步调用编程,本文将继续引入 Spring Boot 的 WebAsyncTask 进行更灵活异步任务处理,包括 异步回调,超时处理 和 异常处理. 正文 1. ...
- 139.00.007 Git学习-Cheat Sheet
@(139 - Environment Settings | 环境配置) Git虽然极其强大,命令繁多,但常用的就那么十来个,掌握好这十几个常用命令,你已经可以得心应手地使用Git了. 友情附赠国外网 ...
- Java—IO流 对象的序列化和反序列化
序列化的基本操作 1.对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 2.序列化流(ObjectOutputStream),writeObject 方法用于将对象写入输出流中 ...
- vs2015使用技巧-------- 查看类关系图
1.在项目上点击右键,点击“查看”------->“查看类图”: 2.生成的类图如下:
- IONIC调用原生的等待对话框
ngCordova提供了progressIndicator插件,用以方便的显示等待对话框,但是目前版本仅支持安卓版本.为了让苹果版本也显示,可以到以下地址下载通用的插件,JS部分的代码无需改变: ht ...
- how to do error handing with WCF by using attributes to log your errors z
There are multiple ways to do error handling in WCF as listed by Pedram Rezaei Blog. The default way ...
- 【Leetcode】【Medium】4Sum
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...
- Linux入门-1 常用命令
写在前面 当年初学Linux的时候,在网上找到nash_su大神的一套视频,讲的特别好,基础部分看了好几遍,很多知识点让我受益至今. 十分庆幸当年的选择,也十分感谢nash_su大神,祝你事事顺心,每 ...