Syntax Colorizer

permlink
using System;
using System.Collections.Generic;
using System.Text;

public class GetToTheTop
{
    private Stair[] stairs;
    private bool[,] compAdj;

    private class Stair : IComparable<Stair>
    {
        public int X, Y, Len, Sweets;

        public Stair(int x, int y, int len, int sweets)
        {
            X = x;
            Y = y;
            Len = len;
            Sweets = sweets;
        }

        public int CompareTo(Stair other)
        {
            if (Y != other.Y)
                return Y.CompareTo(other.Y);
            return X.CompareTo(other.X);
        }

        public int EndX { get { return X + Len; } }

        public bool CanReach(Stair other, int maxDist)
        {
            if (other.Y < Y)
                return false;
            if (Intersect(X, EndX, other.X, other.EndX))
                return other.Y - Y <= maxDist;
            else
            {
                int ourX, otherX;
                if (other.X > EndX)
                {
                    ourX = EndX;
                    otherX = other.X;
                }
                else
                {
                    ourX = X;
                    otherX = other.EndX;
                }
                return Sqr(ourX - otherX) + Sqr(Y - other.Y) <= Sqr(maxDist);
            }
        }

        private bool Intersect(int a1, int b1, int a2, int b2)
        {
            return !(a2 > b1 || a1 > b2);
        }

        private long Sqr(int x)
        {
            return x * x;
        }
    }

    private class Component
    {
        private List<Stair> stairs = new List<Stair>();
        public int Sweets;
        public int Y;

        public bool Empty { get { return stairs.Count == 0; } }

        public void Add(Stair st)
        {
            stairs.Add(st);
            Sweets += st.Sweets;
            Y = st.Y;
        }

        public bool CanReach(Component other, int maxDist)
        {
            for (int i = 0; i < stairs.Count; i++)
            {
                for (int j = 0; j < other.stairs.Count; j++)
                {
                    if (stairs[i].CanReach(other.stairs[j], maxDist))
                        return true;
                }
            }
            return false;
        }

        public bool Belongs(Stair stair, int maxDist)
        {
            Stair last = stairs[stairs.Count - 1];
            return stairs.Count == 0 || (stair.Y == last.Y && last.EndX + maxDist >= stair.X);
        }
    }

    public int collectSweets(int K, int[] sweets, int[] x, int[] y, int[] stairLength)
    {
        stairs = new Stair[sweets.Length];
        for (int i = 0; i < sweets.Length; i++)
            stairs[i] = new Stair(x[i], y[i], stairLength[i], sweets[i]);
        Array.Sort(stairs);

        Component comp = new Component();
        for (int i = 0; i < stairs.Length; i++)
        {
            if (i > 0 && !comp.Belongs(stairs[i], K))
            {
                components.Add(comp);
                comp = new Component();
            }
            comp.Add(stairs[i]);
        }
        if (!comp.Empty)
            components.Add(comp);

        compAdj = new bool[components.Count,components.Count];
        best = new int[components.Count];
        for (int i = 0; i < best.Length; i++)
            best[i] = -1;

        for (int i = 0; i < components.Count; i++)
        {
            for (int j = i + 1; j < components.Count; j++)
            {
                if (components[i].CanReach(components[j], K))
                    compAdj[i, j] = true;
            }
        }

        int res = 0;
        for (int i = 0; i < components.Count; i++)
        {
            if (components[i].Y <= K)
                res = Math.Max(res, Rec(i));
        }

        return res;
    }

    private int[] best;
    private List<Component> components = new List<Component>();

    private int Rec(int startComp)
    {
        if (best[startComp] != -1)
            return best[startComp];

        int res = 0;
        for (int i = 0; i < components.Count; i++)
        {
            if (compAdj[startComp, i])
                res = Math.Max(res, Rec(i));
        }
        return best[startComp] = res + components[startComp].Sweets;
    }
}

For you blog

For web page

About | Send us feedback