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

 

转载于:https://www.cnblogs.com/flowwind/p/3950904.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
混沌差分进化算法是一种基于混沌理论和进化算法的优化算法。它结合了混沌搜索的全局搜索能力和差分进化的局部搜索能力,具有较强的优化性能。 首先,混沌差分进化算法引入了混沌序列作为搜索起点,通过混沌序列的无序、周期性和敏感性等特点,可以有效地遍历搜索空间,并实现全局搜索。混沌序列的产生可以根据混沌映射或混沌方程进行,通过不同的混沌参数设置,可以得到不同的混沌序列。 其次,混沌差分进化算法基于差分进化算法,通过提取种群中个体之间的差异信息来进行局部搜索,并实现逐代进化。在算法的每一代中,根据当前的种群信息,通过选择、交叉和变异等操作,生成新的个体,并用新的个体替换原来种群中的个体。通过这样的迭代过程,逐步优化目标函数的值,最终找到最优解。 混沌差分进化算法在多个领域中得到了广泛应用。在工程优化中,它可以用于解决诸如函数优化、参数估计、模型辨识等问题。在机器学习和数据挖掘领域,它可以用于特征选择、参数调优等任务。此外,在信号处理、图像处理、控制系统设计等领域,混沌差分进化算法也展现出了很好的性能。 总的来说,混沌差分进化算法通过结合混沌搜索和差分进化,充分发挥了它们各自的优势,具有较强的全局搜索和局部搜索能力。在优化问题中,它是一种有效的算法,具有较好的性能和应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值