cf738.A

博主分享了在一道关于位运算替换问题的编程挑战中,如何误读题意并陷入误区的过程。关键在于理解区间选择的重要性,最终正确的方法并非固定区间操作,而是全局遍历。测试数据揭示了答案并不依赖于特定区间,而是整个数据集的操作。
摘要由CSDN通过智能技术生成

我对题意的偏见:大概是这么个意思,就是首先有t组测试数据,每组测试数据长度是n,然后输入数据,在输入的这组测试数据中,你可以任意挑选一个区间,定义为[l, r],然后将al+i,用al+i&ar-i替换,就是将你规定的区间范围内的所有数据都根据上面的公式加上位运算替换掉,题目的要求就在于你要将输入的数据中根据题目给定操作最小化数据中的最大值,最终输出执行操作后的数据中的最小值。(语文很烂,看不懂的一定要自己去看题.)

来一手错误代码:
在这里插入图片描述
我的错误思路:首先对于每组数据我先将他们从小到大排序,然后将区间规定成整个区间(这里为什么规定成整个区间呢,原因是,经过我根据样例数据,我将每组数据排序后进行操作发现所有结果都是正确的,说白了就是我不会如何处理区间选定的问题,根据不同的特殊的测试数据我不会变换区间),在这里我也好言建议大家写代码一定不能只根据样例来写,否则大部分情况代码都只能通过样例,而真正的测试数据会有无数组,什么样奇奇怪怪的数据都会出现,所以如果紧盯着样例写,最终就是个报废代码,相当于浪费了这么长时间,你还要重新构造思路,很浪费时间。然后回到正题,接着就是把下标公式套上去,完成整个区间内的位运算操作,你会发现样例中所有数据结果都是相同的数,例如全是1,全是3或者全是0,所以我自以为所有数据结果也都是相同的数,但是为了以防万一,我将处理后的区间又整个排序,最终输出第一个数(也就是最小的数),果然黄天不负有心人,样例全过,但提交之后第二个预测试数据就没过,这样一来,这道题相当于思路全错,在重新构想就很难了,因为我不知道哪里错了(比赛中是看不了其他测试数据的),真是惨痛的教训!

给你们看看测试数据:
在这里插入图片描述
在这里插入图片描述
但是我的代码运行结果是0 0 7,为什么会错呢?看好了,当排完序后,序列变成了7 21 21 21 21 47,操作序列为:7&47 21&21 21&21 21&21 21&21 47&7,答案明显是7,但是回到原始测试数据47 7 21 21 21 21,我们这样来算,首先47&7,然后得到的结果为x,x=x&21,知道序列最后一个数据,47的二进制表示是101111,7的二进制表示是111,按位与操作后答案是111,111&10101(21),可以发现,答案是101,也就是5,101&10101,答案还是101,最终正确答案就是5.说白了,我感觉这道题的选定区间就是迷惑人的,最终AC的代码根本没有区间选定,就是从头开始一次按位与操作,因为数据范围也就100,这道题告诉我一定要经过很多次尝试,选择最优的思路代码提交,AC率可能更高。

最后,感谢大佬们看到菜鸟题解的最后。
本来就是想加强题感,没什么其他意思,随便写写,感谢观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值