CSDN 分糖果算法的思路和求助


昨天晚上 在csdn上做了一道分糖果的題目,我自個測的是沒有問題,但是提交答案后,老失敗,提示

你的程序正常運行並輸出了結果,但是答案錯誤
你的程序輸出結果與測試數據中的輸出結果不符

我先把自個思路說一下,再把我的代碼貼出來,你們幫忙看看,哪里出了問題,或者有更好的思路分享下。

題目是這樣的:地址:http://student.csdn.net/mcs/programming_challenges 第二道題目

有n個小朋友站成一排(編號從0到n-1),每個小朋友有一個rating值,存放在ratings數組中。老師需要給他們分配糖果,每個小朋友至少需要一顆糖果,對於任意相鄰的兩個小朋友i和i+1,rating值大的必須比rating值小的分配的糖果多(rating相同的沒必要分配一樣多的糖果)。
請計算最少需要多少顆糖果,才能完成上述分配。
輸入格式:
多組數據,每組數據第一行是一個正整數n。
接下來n行,每行有1個正整數,表示每個小朋友的rating值。所有整數都不超過100000。
輸出格式:
每組數據一行,包括一個正整數,表示做少需要的糖果數。

 

我的思路是 從0開始遍歷小朋友,每一次求出當前小朋友可以拿到的最少糖果數,每一次比對前后位置;

前面的位置比對一次就可以了,若大於前面小朋友的rating值,則當前應該得到的糖果數為上一位小朋友得到的糖果數+1,若小於等於前面小朋友的rating值,則自動將應得糖果數變為1;

設置往后比對應得糖果數為1的臨時變量,然后開始往后面比對,如果后面小朋友的rating值,小於當前小朋友的rating值,則當前小朋友應得糖果數的臨時變量+1,繼續比對后面小朋友,如果是遞減,則不斷+1,直到遞減結束;

比對該臨時變量和往前比對應得糖果數,取二者的最大值,即為當前小朋友應得最少糖果數。

這樣求出每次小朋友應得最少糖果數,依次相加即可得到最少糖果數。

具體代碼如下:

 1         static void Main(string[] args)
 2         {
 3             Console.WriteLine("輸入n跳出循環,或者其他字符開始游戲");
 4             while (Console.ReadLine() != "n")
 5             {
 6                 GetMin();
 7                 Console.WriteLine("輸入n跳出循環,或者其他字符繼續游戲");
 8             }
 9 
10         }
11         static void GetMin()
12         {
13             //  Console.WriteLine("請輸入整數");
14 
15             string input = Console.ReadLine();
16             int inputNum;
17             while (!int.TryParse(input, out inputNum))
18             {
19                 // Console.WriteLine("請輸入整數");
20                 input = Console.ReadLine();
21             }
22             if (inputNum == 0)
23             {
24                 Console.WriteLine("0");
25                 return;
26             }
27 
28 
29             int[] arys = new int[inputNum];
30             //Random rm=new Random();
31             //for (int i = 0; i < inputNum; i++)
32             //{
33             //    arys[i] = rm.Next(1, 15);
34             //    Console.Write(arys[i]+" ");
35             //}
36             //Console.WriteLine();
37 
38             int tmp;
39             for (int i = 0; i < inputNum; i++)
40             {
41                 input = Console.ReadLine();
42                 while (!int.TryParse(input, out tmp) || tmp > 100000 || tmp <= 0)
43                 {
44                     Console.WriteLine("請輸入不超過100000的正整數");
45                     input = Console.ReadLine();
46                 }
47                 arys[i] = tmp;
48             }
49 
50             int sum = 0;
51             int num = 1;
52             int j;
53             //遍歷每個小朋友
54             for (int i = 0; i < arys.Length; i++)
55             {
56                 j = i;
57                 //往前比對 求出應得最少糖果數
58                 if (j >= 1 && arys[j] > arys[j - 1])
59                 {
60                     num++;
61                 }
62                 else
63                 {
64                     num = 1;
65                 }
66                 //開始往后比對,求出往后比對應得最少糖果數
67                 int next = 1;
68                 while (j < arys.Length - 1 && arys[j] > arys[j + 1])
69                 {
70                     j++;
71                     next++;
72                 }
73                 //比對 往前比對和往后比對的結果 取二者中最大值 作為應得最少糖果數
74                 num = num > next ? num : next;
75                 //Console.WriteLine("num:" + num);
76                 sum += num;
77             }
78             Console.WriteLine("最少應得糖果數" + sum);
79         }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM