力扣周赛乐鑫专场(下)

417 阅读2分钟

这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战

乐鑫02. 调整电平

截屏2021-08-25 下午9.53.46.png

思路分析

这种题如果是单纯的模拟的话,应该是n^2的时间复杂度,

for(int i = 1; i <= cnt; i++){
    for(int j = 0; j < cnt; j++){
        if((j+1) % i == 0){
            if (arr[j] == 0){
                arr[j] = 1;
            }else{
                arr[j] = 0;
            }
        }
    }
}

当然,这样的时间复杂度一定会超时,不过看起来很难用动态规划或者二分剪枝,所以应该试试数学方法。

对于某一个点 i,在其约数的轮次会被调整一次。例如 12 在 1, 2, 3, 4, 6, 12 轮各被调整一次,3 在 1, 3轮各被调整一次。

所以最终某点若处于高电平,说明该点被调整了奇数次,也即只有奇数个约数。根据数学知识,只有完全平方数才有奇数个约数,所以这道题变为1,cnt有多少个完全平方数,即1,4,9之类的,根据数学知识我们发现这个数字正是cnt\sqrt{cnt}取整。

乐鑫04. 自行车拉力赛

截屏2021-08-25 下午10.24.30.png

思路分析

这道题感觉要么是dfs遍历每种前进可能,要么是动态规划,但是这道题如果是动态规划的话,需要一个额外的数组遍历某种策略是否可以到达。但是如何选择dp[i]该使用的前置数组元素,又是一个问题,所以需要换个思路。

  • 首先我们需要尽可能的喝存水量多的补水站,因为只有这样才能使我们的补水次数最少
  • 我们在补水时,其实是不知道什么时候缺水,大多时候都是先到达补水站,如果不补水可能会缺水

因此可以使用优先队列将补水站存起来,在到达一个补水站时计算是否缺水,如果缺水,引用队首补水站,如果不缺水,将补水站加入队列中即可。