虽然比较失败 , 但是总结还是要写的 .
第一题 CircleMarket 比较简单 , 遍历一遍得到最终的关门时间 endTime 后 , 然后单纯的模拟就行了 , 从时间 0 开始到 endTime, 累加移动的时间 , 判断一下 , 到 endTime 的时候就得到买了多少东西了 .
第二题 ChickenOracle 想了好久还是不得要领 , 最终参考了各大牛的代码 , 但是逻辑依然乱的很 . 最终用下图表示终于清晰了 . 整个的 n 个人可以分为如下的 4 部分 . 如果设第三部分的人数为 x 的话 , 则第一部分就是 lieCount-x, 第二部分则是 n+x-lieCount-liarCount, 第四部分则是 liarCount-x.
这样就比较清晰了,柯南说过,真像只有一个,那么最终说出的真像的个数(并不是真实真像的个数)就是第二部分和第三部分的和。然后假设一个真像,是鸡或者是蛋,然后各部分的数值均 >=0 即可。
比如说,先有蛋是真像,那么 eggCount=x+(n+x-lieCount-liarCount); 那么用这个式子可以得出 x=(eggCount-n+lieCount+liarCount)/2, 如果 eggCount-n+lieCount+liarCount 是 2 的倍数,同时, 4 个部分均 >=0 ,即 x>=0 && lieCount>=0 && n+x-lieCount-liarCount>=0 && liarCount-x>=0 ,那么我们可以说,这样的 x 是存在的,即先有蛋是可能的。
现有鸡的做法也一样,只不过公式变为 n-eggCount=x+(n+x-lieCount-liarCount); 后面的推理类似。
1 未知真相 说真话 |
2 知真相 说真话 |
3 未知真相 说假话 |
4 知真相 说假话 |
第三题 BatchSystem 也很简单,就是操作系统中的短作业优先,贪心算法,需要注意的就是 int 的精度不够处理中间的的计算过程,即每个人的总的作业耗时。还有就是注意输出的格式,是要字典序的。