0

リストを使用してタスクを解決しようとしていますが、解決に非常に近づいていることはわかっていますが、今は行き詰まっています。コードに何か問題があり、それが何であるかわかりません。見て、助けてください:

        /*
Write a program that reads an array of integers and removes from it a minimal number of elements in such way that the
remaining array is sorted in increasing order. Print the remaining sorted array.
Example: {6, 1, 4, 3, 0, 3, 6, 4, 5}  {1, 3, 3, 4, 5}
 */
using System;
using System.Collections.Generic;

class RemoveMinimalElements
{

    static void Main()
    {
        int n;
        n = int.Parse(Console.ReadLine());
        List<int> arr = new List<int>();
        List<int> sorted = new List<int>();
        int maxSubsetLenght = 0;

        for (int i = 0; i < n; i++)
        {
            arr.Add(int.Parse(Console.ReadLine()));
        }


        for (int i = 1; i <= (int)Math.Pow(2, n) - 1; i++)
        {
            int tempSubsetLenght = 0;
            string tempString = "";
            List<int> temp = new List<int>();


            for (int j = 1; j <= n; j++)
            {
                int andMask = i & (1 << j);
                int bit = andMask >> j;

                if (bit == 1)
                {
                    temp.Add(arr[n - 1 - j]);
                    tempSubsetLenght++;
                }
                if (tempSubsetLenght > maxSubsetLenght)
                {
                    maxSubsetLenght = tempSubsetLenght;

                    for(int k =1; k < temp.Count; k ++)
                    {
                        if (temp[k] >= temp[k - 1])
                        {
                            sorted = temp;
                        }
                    }
                }
            }
        }

        for (int i = sorted.Count - 1; i > 0; i--)
        {
            Console.WriteLine(sorted[i]);
        }
    }
}
4

4 に答える 4

1

私はコードに従わず、あなたのアプリをテストしただけです。

これが私の最初の入力です: 5.

次に、これらの 5 つの入力 2,4,6,8,10 を入力したので、

arr = {2,4,6,8,10};

そして、最後の行になると、 arr [item]をフェッチしようとしていて、アイテムが6であるため、存在しないフェッチを試みているため、 ArguementOutOfRangeExceptionが発生しました。 (Index was out of range. Must be non-negative and less than the size of the collection.)arr[6]

于 2013-01-13T08:19:27.497 に答える
0

徹底的な検索があなたのケースに適しているかどうかはわかりませんが、これはあなたのために機能しますか?

static void Main(string[] args)
        {
            int[] input = new[] { 6, 1, 4, 3, 0, 3, 6, 4, 5 };
            int[] expectedOutput = new[] { 1, 3, 3, 4, 5 };

            int[] solution = TryGetSolution(input);

            Console.WriteLine("Input: " + FormatNumbers(input));
            Console.WriteLine("Expected Output: " + FormatNumbers(expectedOutput));
            Console.WriteLine("Output: " + FormatNumbers(solution));
            Console.ReadLine();
        }

        private static string FormatNumbers(int[] numbers)
        {
            return string.Join(", ", numbers);
        }

        private static int[] TryGetSolution(int[] input)
        {
            return TryWithoutAnyItem(input);
        }

        private static int[] TryWithoutAnyItem(int[] items)
        {
            return Enumerable.Range(0, items.Length)
                             .Select(i => TryWithoutItem(items, i))
                             .Where(solution => solution != null)
                             .OrderByDescending(solution => solution.Length)
                             .FirstOrDefault();
        }

        private static int[] TryWithoutItem(int[] items, int withoutIndex)
        {
            if (IsSorted(items)) return items;
            var removed = items.Take(withoutIndex).Concat(items.Skip(withoutIndex + 1));
            return TryWithoutAnyItem(removed.ToArray());
        }

        private static bool IsSorted(IEnumerable<int> items)
        {
            return items.Zip(items.Skip(1), (a, b) => a.CompareTo(b)).All(c => c <= 0);
        }
    }
于 2013-01-13T11:19:56.663 に答える
0

解決しました!ご支援ありがとうございました。私は初心者で、まだ難しいものを使用して理解することができないので、私がすでに知っていることで私がしたことは次のとおりです。

/*
Write a program that reads an array of integers and removes from it a minimal number of elements in such way that the
remaining array is sorted in increasing order. Print the remaining sorted array.
Example: {6, 1, 4, 3, 0, 3, 6, 4, 5}  {1, 3, 3, 4, 5}
 */
using System;
using System.Collections.Generic;

class RemoveMinimalElements
{
    static bool CheckAscending(List<int> list)
    {
        bool ascending = true;

        for (int i = 0; i < list.Count - 1; i++)
        {
            if (list[i] > list[i + 1])
            {
                ascending = false;
            }
        }

        return ascending;
    }

    static void Main()
    {
        int n;
        n = int.Parse(Console.ReadLine());
        List<int> arr = new List<int>();
        List<int> sorted = new List<int>();
        int maxSubsetLenght = 0;

        for (int i = 0; i < n; i++)
        {
            arr.Add(int.Parse(Console.ReadLine()));
        }


        for (int i = 1; i <= (int)Math.Pow(2, n) - 1; i++)
        {
            int tempSubsetLenght = 0;
            List<int> temp = new List<int>();


            for (int j = 1; j <= n; j++)
            {
                if (((i >> (j - 1)) & 1) == 1)
                {
                    temp.Add(arr[j - 1]);
                    tempSubsetLenght++;
                }

            }

            if ((tempSubsetLenght > maxSubsetLenght) && (CheckAscending(temp)))
            {
                sorted = temp;
                maxSubsetLenght = tempSubsetLenght;
            }
        }

        for (int i = 0; i < sorted.Count; i++)
        {
            Console.WriteLine(sorted[i]);
        }
    }
}
于 2013-01-13T15:58:45.870 に答える