[Code Jam] Snapper Chain ---常规算法

来源:互联网 发布:vb.net 连接本地数据库 编辑:程序博客网 时间:2024/05/04 14:07

虽然是常规方法,但是也应用了很难察觉的一个技巧:

 

1. 设置两组数组,分别储存ON/OFF的状态和POWERED/UNPOWERED的状态。

2. POWERED/UNPOWERED的状态可以由ON/OFF的状态推出

3. 对这两组数进行异或运算,得出的新数组成为ON/OFF的新状态

 

显然,这个方法的关键在于异或运算,其具体特点在以前转载的一篇文章中已经提到过。

本题中运用“^”的原理在于:1异或任何数 = 任何数取反

 

在Java中全部代码如下:

 

有以下几点需要注意:

 

1. 本例中的算法其实相当具有代表性,其执行过程就是依次对变量数组进行更新赋值,在构造这样的运算时,结构如下:

    Case [i] 循环开始;

            读取数据构造数组;

            首先讨论特殊情况(比如某变量为0或者1时等),得出solution;

            else

                  对数组进行初始化赋值;

                  开始循环过程,逐步赋值;(这里要注意每次更新数组的值要保证上次循环的结果不会造成干扰)

                  读取数组中的值,得出solution;

            输出Case [i] 的结果;

    Case [i] 循环结束;

2. break的用法:

    break和continue的区别是,在for和while循环中:

    break是跳出本层循环,后面没有操作。

    continue是不执行本次操作,但是直接转入下一次循环,也就是循环继续。

3. 本次算法的复杂度取决于N和K的数量级,当两者比较小时,比如1000,速度几乎不受影响。

    但是如果其中一个出现了10的8次方这种大数量级,那么算法将会慢的不可忍受,因此也不可能解决large input的问题。

    那么如何用高效的方法解决呢?下一篇文章将会讲到。

原创粉丝点击