BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #96669同步于 2018/9/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

【问题】百度笔试题

a2013211232
2018/9/27镜像同步24 回复
给定N个宝箱,每个宝箱可能是普通宝箱或者宝箱怪中的一种,每个宝箱上贴着一张字条,字条给定以下两种信息的一种:1)第x个宝箱是普通宝箱。2)第x个宝箱是宝箱怪 其中普通宝箱上的信息一定是真的,宝箱怪上的信息__可能__是假的,问根据这些信息,有多少个宝箱__一定__是普通宝箱,有多少个宝箱__一定__是宝箱怪? >输入: >第一行一个整数N,1<=N<=10^5 >接下来N行,每行两个整数t,x,1<=t<=2,1<=x<=N,若t=1,则表示第i个宝箱说第x个宝箱是普通宝箱,若t=2,则表示第i个宝箱说第x个宝箱是宝箱怪 >输出: >一行两个整数c1,c2,空格隔开,c1表示__一定__是普通宝箱的数量,c2表示__一定__是宝箱怪的数量 >输入: >3 >1 2 >2 1 >1 3 >输出: >0 1 现在好奇两个问题: 1)到底要在什么情况下才能确定一个宝箱是普通宝箱,因为宝箱怪也有可能说真话所以我一直觉得c1=0 2)本来用的dfs思路去观察有没有矛盾,例如就是先假设1是普通宝箱(设为true),然后顺着1说的话往下推,最后有矛盾则说明1是宝箱怪,但是问题在于如果没有矛盾又不能说明什么。而且没有矛盾还得把1的值true重置掉,实际写代码感觉超复杂,呜呜呜 求解呀
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
fouzhe机器人#1 · 2018/9/27
感觉像是2-sat
intmain机器人#2 · 2018/9/27
上班时间粗略的想了一下,最暴力的就是穷举2^n中情况,然后求可行解的交集。优化的话只想到dfs加上剪枝,根据当前假设为真宝箱上的信息减少需要判断的情况 Emmm...感觉复杂度还是有点高...
uvj1010机器人#3 · 2018/9/27
同样认为c1总为0…
allwell机器人#4 · 2018/9/27
c1总为0,c2只需要求最多有多少个可以为真 我是这么做的,穷举: def: 如果当前点到了最后:返回当前为真的个数 若当前点为真: 当前点不能为真:返回0 当前点可以为真: 当前点为真 按照当前点的指向:指向为真的标记为真,为假标记为假 return max(def(下个点为真),def(下个点为假)) 当前点为假反之 这样算出最大的可以为真的个数 自己写的太乱了,最后没实现成功[ema1]
dxy1机器人#5 · 2018/9/27
【 在 a2013211232 的大作中提到: 】 : [md] : 给定N个宝箱,每个宝箱可能是普通宝箱或者宝箱怪中的一种,每个宝箱上贴着一张字条,字条给定以下两种信息的一种:1)第x个宝箱是普通宝箱。2)第x个宝箱是宝箱怪 : 其中普通宝箱上的信息一定是真的,宝箱怪上的信息__可能__是假的,问根据这些信息,有多少个宝箱__一定__是普通宝箱,有多少个宝箱__一定__是宝箱怪? : ................... ans1 = 0,有个同学100%过了
liu4858504机器人#6 · 2018/9/27
首先题目要求的是一定是普通宝箱或者宝箱怪的个数. 那么我们来看一下C1的情况, 如果一定是普通宝箱?这种情况是无法确定的,因为嘤嘤怪只要都说真话那就等同于普通宝箱, 所以我们并不能说一个箱子一定是普通宝箱,所以C1=0. 然后我们再来看一下C2,即一定是嘤嘤怪的个数,那么什么样的情况下这个宝箱一定是嘤嘤怪呢? 我们假设从某个宝箱为普通宝箱,然后从他出发,因为此时一定说的是真话,那么此时他就可以指出 下一个宝箱是什么,如果是2(嘤嘤怪),那么信息就丢失了,因为我们要求的是一定是,而这个嘤嘤怪可能说真 也可能说假,相当于啥都没说,所以我们要选择是下一个也是1(普通宝箱)的来进行转移,那么什么时候会出现问题呢? 假设到了某个时刻又转移到了以前已经到达的某个状态,并且此时的回答是2,那么就矛盾了。因为刚才普通宝箱说了这个 状态是1,但此时又有一个普通宝箱说他的状态是2,矛盾了!所以说我们的假设不正确,这个箱子不是普通宝箱,那它必是 嘤嘤怪。 所以我觉得此题有点类似于一个贪吃蛇不断吃东西,回答为1就吃,突然吃到自己尾巴了(环),然后就矛盾了。 这种想法的代码如下: public static int solve(int[] a, int[] b) { boolean[] used = new boolean[a.length]; int count = 0; for (int i = 0; i < a.length; i++) { Arrays.fill(used, false); used[i] = true; int target = b[i]-1; int responce = a[i]; while (responce == 1 && !used[target]) { used[target] = true; responce = a[target]; target = b[target]-1; } if (used[target] && responce == 2) count++; } return count; }
qingfeng87机器人#7 · 2018/9/27
楼上毕竟组里代码担当,留皮
ytz123机器人#8 · 2018/9/27
今年多校原题啊...百度"hdu6370"... 可以所有箱子都是宝箱怪,所以c1=0 假设一个箱子是普通宝箱,如果顺着第一种信息指下去出现矛盾,那么路径上的都是箱子都是宝箱怪...建反向边然后dfs可以做到O(N)复杂度,代码百度就成了
zuihuayin机器人#9 · 2018/9/27
赞你