开关

来源:互联网 发布:ov7670 51单片机引脚图 编辑:程序博客网 时间:2024/04/24 23:46

题目描述:

小明家有n-1盏电灯,编号为2..n。同样有n-1个开关控制这n-1盏电灯。奇怪的是开关和电灯不是一一对应的。如果按下编号为I的开关,编号为I的倍数的所有电灯都会被改变状态(从亮变暗,或者从暗边亮)。小明每天回到家就面临一个严重的问题,所有的电灯都是暗的,他想打开所有的电灯。你要做的就是帮小明找到一种的办法,使得打开最少的开关就可以将所有的电灯打开。1 <= n <= 10000。若不能使所有电灯都打开,则输出 -1 。

解题思路:

解法一:乍看起来这好像是一道数学题,但还没想出经过严格证明的数学方法来,可以用类似贪心的方法来做。

每次在原数列中处于熄灭状态中的灯中找出一个数:

(1)    约数个数最少;

(2)    然后是在数列中的倍数最少;

(3)    符合上述条件的最大数;

然后按下这个开关,得出新的数列,再在新的数列中重复上述过程,直至所有的灯都处于开启状态。

这道题目应该是不会出现无解的情况的。

解法二:不过针对每个开关设Xi表示按下开关i的次数,显然为了求得最优解,Xi的值只有两种可能,0或者是1。

X2 = 1

     X3 = 1

     X2 +X4 =1

     X5 = 1

     X2 + X3 + X6 = 1

     ……

即对于开关i,设数i的所有非1约数为Ai,则有:∑XAi =1。然后可以用高斯消元解决这些方程组。答案是∑Xi 。另外影响i的状态的因素只与它的约数即比它小的数有关,所以我们完全可以用递推直接计算出Xi来。


代码写在家里的电脑上找不到了……等以后补一下,这种题目了解了大致思路基本上就没有问题了。

0 0
原创粉丝点击