Friday, May 8, 2015

Google Code Jam 2015 Round 1B Problem B. Noisy Neighbors

// Google Code Jam 2015 Round 1B Problem B. Noisy Neighbors
// Problem URL: 
https://code.google.com/codejam/contest/8224486/dashboard#s=p1&a=0


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace GoogleCodeJam_Practice
{
    class Program
    {
        int R;
        int C;
        int N;
        string ProcessCase ( )
        {
            int ans=int.MaxValue;
            int RxC = R * C;
            bool zero=false;
            if ( RxC % 2 == 1 )
            {
                if ( N <= ( RxC / 2 ) + 1 )
                    ans = 0;
            }
            else
            {
                if ( N <= RxC / 2 )
                    ans = 0;
            }
            if ( ans != 0 )
            {
                // alternative 1
                List<int> nwalls=new List<int> ( );
                for ( int y = 0; y < R; y++ )
                {
                    int x0=( y + 1 ) % 2;
                    for ( int x = x0; x < C; x += 2 )
                    {
                        int nwCanBeRemoved=4;
                        if ( x == 0 ) nwCanBeRemoved--;
                        if ( x == C - 1 ) nwCanBeRemoved--;
                        if ( y == 0 ) nwCanBeRemoved--;
                        if ( y == R - 1 ) nwCanBeRemoved--;
                        nwalls.Add ( nwCanBeRemoved );
                    }
                }
                nwalls.Sort ( );
                nwalls.Reverse ( );     // set up room to remove one by one, start from the one reducing more unhappiness
                int nEmptyRoom = R * C - N;
                int unhappyness = R * ( C - 1 ) + C * ( R - 1 );    // set to the max possible first
                for ( int i = 0; i < nEmptyRoom; i++ )
                {
                    unhappyness -= nwalls[i];
                }
                ans = unhappyness;

                // alternative 2
                nwalls = new List<int> ( );
                for ( int y = 0; y < R; y++ )
                {
                    int x0=( y % 2 );
                    for ( int x = x0; x < C; x += 2 )
                    {
                        int nwCanBeRemoved=4;
                        if ( x == 0 ) nwCanBeRemoved--;
                        if ( x == C - 1 ) nwCanBeRemoved--;
                        if ( y == 0 ) nwCanBeRemoved--;
                        if ( y == R - 1 ) nwCanBeRemoved--;
                        nwalls.Add ( nwCanBeRemoved );
                    }
                }
                nwalls.Sort ( );
                nwalls.Reverse ( );     // set up room to remove one by one, start from the one reducing more unhappiness
                nEmptyRoom = R * C - N;
                unhappyness = R * ( C - 1 ) + C * ( R - 1 );    // set to the max possible first
                for ( int i = 0; i < nEmptyRoom; i++ )
                {
                    unhappyness -= nwalls[i];
                }
                if ( unhappyness < ans )
                    ans = unhappyness;
            }

            return ans.ToString ( );
        }

        void Start ( )
        {
            string file1;
            string file2;
            file1 = @"e:\test_input.txt";
            file1 = @"e:\B-small-practice.in";
            StreamReader infile = new StreamReader ( file1 );
            file2 = @"e:\ztest.out";
            StreamWriter outfile = new StreamWriter ( file2 );

            PreProcess ( );
            int nCases = int.Parse ( infile.ReadLine ( ) );
            for ( int ncase=0; ncase < nCases; ncase++ )
            {
                string line = infile.ReadLine ( );
                string[] inputs = line.Split ( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries );
                R = int.Parse ( inputs[0] );
                C = int.Parse ( inputs[1] );
                N = int.Parse ( inputs[2] );

                // process case
                string result = ProcessCase ( );

                //WriteOutput ( string.Format ( "R,C,N: {0} {1} {2}", R, C, N ), outfile );
                WriteOutput ( string.Format ( "Case #{0}: {1}", ncase + 1, result ), outfile );
            }
            infile.Close ( );
            outfile.Close ( );
        }

        private void PreProcess ( )
        {
        }

        private void WriteOutput ( string text, StreamWriter outfile )
        {
            outfile.WriteLine ( text );
            Console.WriteLine ( text );
        }

        static void Main ( string[] args )
        {
            Program p = new Program ( );
            p.Start ( );
        }
    }
}

Google Code Jam 2015 Round 1B Problem A. Counter Culture

// Google Code Jam 2015 Round 1B Problem A. Counter Culture
// Notes: This solution works for small input only!
// Problem URL: https://code.google.com/codejam/contest/8224486/dashboard#s=p0&a=0

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace GoogleCodeJam_Practice
{
    class Program
    {
        long N;
        long GetReversed ( long N )
        {
            char[] c = N.ToString ( ).ToCharArray ( );
            Array.Reverse ( c );
            long r = long.Parse ( new string ( c ) );
            return r;
        }

        int[] rev;
        int[] steps;
        string ProcessCase ( )
        {
            long ans=steps[( int ) N];

            return ans.ToString ( );
        }

        void Start ( )
        {
            string file1;
            string file2;
            file1 = @"e:\test_input.txt";
            file1 = @"e:\A-small-practice.in";
            StreamReader infile = new StreamReader ( file1 );
            file2 = @"e:\ztest.out";
            StreamWriter outfile = new StreamWriter ( file2 );

            rev = new int[1000001];
            for ( int i = 0; i < rev.Length; i++ )
            {
                rev[i] = ( int ) GetReversed ( i );
            }
            steps = new int[1000001];
            for ( int i = 0; i < steps.Length; i++ )
                steps[i] = int.MaxValue;
            steps[1] = 1;
            for ( int i = 2; i < steps.Length; i++ )
            {
                steps[i] = Math.Min ( steps[i], steps[i - 1] + 1 );
                int r = rev[i];
                steps[r] = Math.Min ( steps[r], steps[i] + 1 );
            }

            int nCases = int.Parse ( infile.ReadLine ( ) );
            for ( int ncase=0; ncase < nCases; ncase++ )
            {
                string line = infile.ReadLine ( );
                string[] inputs = line.Split ( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries );
                N = int.Parse ( inputs[0] );

                // process case
                string result = ProcessCase ( );

                WriteOutput ( string.Format ( "Case #{0}: {1}", ncase + 1, result ), outfile );
            }
            infile.Close ( );
            outfile.Close ( );
        }

        private void WriteOutput ( string text, StreamWriter outfile )
        {
            outfile.WriteLine ( text );
            Console.WriteLine ( text );
        }

        static void Main ( string[] args )
        {
            Program p = new Program ( );
            p.Start ( );
        }
    }

}