Saruman's Army (POJ#3069)

by TmskSt
♥0 | Line 21 | Modified 2012-03-06 01:46:49 | MIT License
play

ActionScript3 source code

/**
 * Copyright TmskSt ( http://wonderfl.net/user/TmskSt )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/skEs
 */

package {
    /*
     * Saruman's Army (POJ#3069)
     * http://poj.org/problem?id=3069
     *
     *
     * 問題
     * 
     * N個の点が直線上にあります。点iの位置はXiです。N個のうちのいくつかの点を選び、それらの点に印を
     * 付けます。N個のすべての点について、距離がR以内の場所に印を付けられた点がなければなりません(自分に印が付いていれば、
     * 距離が0のところにあると考えます)。条件を満たすようにしながら、できるだけ印を付ける点を少なくしたいです。何個の点に印をつける必要があるでしょうか。
     *
     * 『プログラミングコンテストチャレンジブック 第2版』より引用
     */
    public class SarumansArmy extends Example {
        
        private static const N:int = 7;//3;
        private static const R:int = 10;//0;
        private var Xi:Vector.<int> = new <int>[70,30,1,7,15,20,50];//[10,20,20];
        
        public function SarumansArmy () {
            
            Xi.sort(Array.NUMERIC);
            
            var m:int = 0, a:int = 0;
            f();
            
            function f(i:int = 1):void {
                if (m + i == N ) return;
                (Xi[m] + R > Xi[m + i]) ? f(i + 1) : g(i);
            }
            
            function g(i:int):void {
                a++, m += i, f();
            }
            
            trace("Ans : " + a);
        }
    }
    import com.actionscriptbible.Example;
}