欢乐暑假线上编程比赛第四题:分配糖果 csdn

赤小兔兔 2014-09-03 12:01:21
这一题我测试过许多次都没问题,就是过不了,系统提示:“你的程序输出结果与测试数据中的输出结果不符”。
题目详情:
有n个小朋友站成一排(编号从0到n-1),每个小朋友有一个rating值,存放在ratings数组中。老师需要给他们分配糖果,每个小朋友至少需要一颗糖果,对于任意相邻的两个小朋友i和i+1,rating值大的必须比rating值小的分配的糖果多(rating相同的没必要分配一样多的糖果)。
请计算最少需要多少颗糖果,才能完成上述分配。
输入格式:
多组数据,每组数据第一行是一个正整数n。
接下来n行,每行有1个正整数,表示每个小朋友的rating值。所有整数都不超过100000。
输出格式:
每组数据一行,包括一个正整数,表示做少需要的糖果数。

答题说明:
输入样例
3
1
2
2
输出样例:
4

我的思路:我认为这个题目和求最大上升子序列是一类题。按照输入的rating值进行顺序判断,
若是上升序列:总糖果数 += 1+2+...+n (n为上升序列的长度)
若是下降序列:总糖果数 += 1+2+...+n (n为下降序列的长度)
当下降序列结束时,如果前一个序列的最后一个rating值小于等于n,则这个rating值要改为n+1
若是相等序列:因为rating相同的没必要分配一样多的糖果,所以可以为1

下面是我的JAVA代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Candy {
static long sum = 0;//糖果总数
static long num = 0;//计算上升或下降序列长度
static boolean shang = true;//记录上一个序列是上升序列还是下降序列,平行序列也视为上升
static int befor = 0;//记录前一个rating值
static long height = 0;//记录前一个序列最后一个值的大小

public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt(); //孩子数量
int rating;
if (n > 0) {
rating = cin.nextInt(); //获取第一个孩子的rating值
befor = rating;
num++;
sum += num;
n--;
}
while (n-- > 0) {
rating = cin.nextInt();
if (rating == befor) {
change();
num = 1;
sum += num;
height = 1;
shang = true;
} else {
if (shang) { //前一个是上升序列或平行序列
if (rating > befor) {
num++;
sum += num;
} else { //表示上升序列结束,下一个下降序列开始
height = num;
num = 1;
sum += num;
shang = false;
}
} else { //前一个是下降序列
if (rating < befor) {
num++;
sum += num;
} else { //表示下降序列结束,下一个上升序列开始
change();
num = 2;
sum += num;
shang = true;
}
}
}
befor = rating;
}
change();
System.out.println(sum);
cin.close();
}

/**
* @Title change
* @Description 如果当前序列为下降序列,且前面还有序列,
* 且当前序列的最大值大于大于前一个序列的最大值,
* 则修改前一个序列的最大值
*/
private static void change() {
if (!shang && height>0 && num >= height) {
sum = sum - height + num + 1;
}
}
}

求一个让代码运行错误的测试用例
...全文
342 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-09-04
  • 打赏
  • 举报
回复
引用 5 楼 GAOCHENGCGCGGC 的回复:
[quote=引用 4 楼 lm_whales 的回复:]
我认为只要是rating值相等的后面不是下降序列,从第二个相等的rating值后都可以是1。 因为最后一个相等的rating值要保证后面的下降序列能下降[/quote] 就是这个下降序列序列最麻烦,处理好了应该就可以了
赤小兔兔 2014-09-03
  • 打赏
  • 举报
回复
引用 1 楼 nice_cxf 的回复:
不是这么简单,要把两侧长度都算出来,根据高低决定顶点 给个例子 1,2,3,5,4,3,2,1
结果不是21吗?我代码里考虑到定点问题了
赤小兔兔 2014-09-03
  • 打赏
  • 举报
回复
引用
#1 不是这么简单,要把两侧长度都算出来,根据高低决定顶点 给个例子 1,2,3,5,4,3,2,1
结果不是21吗?
nice_cxf 2014-09-03
  • 打赏
  • 举报
回复
不是这么简单,要把两侧长度都算出来,根据高低决定顶点 给个例子 1,2,3,5,4,3,2,1
赤小兔兔 2014-09-03
  • 打赏
  • 举报
回复
引用 4 楼 lm_whales 的回复:
峰 台台 台台 台 111111234532111112345643211234598765543211111。。。。。。 谷 谷 谷 谷 其实这里最难处理的,是连续两个rating值相等的,因为既可以直接降落,也可以维持不变 他有两个选择,需要选其中最好的,这是个搜索过程。 一旦超过三个ating值相等的,就可以直接降到1个糖果为止。
我认为只要是rating值相等的后面不是下降序列,从第二个相等的rating值后都可以是1。 因为最后一个相等的rating值要保证后面的下降序列能下降
lm_whales 2014-09-03
  • 打赏
  • 举报
回复
峰 台台 台台 台 111111234532111112345643211234598765543211111。。。。。。 谷 谷 谷 谷 其实这里最难处理的,是连续两个rating值相等的,因为既可以直接降落,也可以维持不变 他有两个选择,需要选其中最好的,这是个搜索过程。 一旦超过三个ating值相等的,就可以直接降到1个糖果为止。
购买后下载课件即可获取课程素材下载地址。我们的教育理念是,为用而学,而不是为学而学。所以我们的课程中,每节课都会带着孩子创作一个精美的动画作品、或者游戏作品。同时,也会向孩子强化一个观念,我们编程是为了创作有趣有料的作品,绝不是为了学编程而学编程。创作的素材都是作者精挑细选的,这些素材包括音乐、角色和背景。挑选素材的标准是要自然、有美感,拒绝低俗,比如说,我们的音乐素材里就有舒伯特的《音乐的瞬间》,还有非常经典的《美国巡逻兵》;同时素材的挑选也要兼顾孩子的兴趣,整体的风格比较活泼,比如角色中就有孩子们喜欢的圣诞老人、雪人、还有马戏团小丑。教育的宗旨不是用糖果哄着孩子学习,而是要用学习本身的美去唤醒孩子内心深处想要学习的动力。作者认为最好的方法就是带着孩子用编程去创作美好的作品,让创作的喜悦成为激发孩子不断学习的源动力。这也就是我们这套课程《scratch少儿编程——创作的喜悦》名称的由来。这套课程我们计划一共出三个阶段,目标是帮助孩子完整的理解编程的概念,并且可以独立创作自己想要的作品。目前大家看到的只是第一阶段。第一阶段的课程主要侧重点在于让孩子熟悉scratch的编程环境,熟悉scratch的基本操作,并且简单的体验编程的概念。在后续的两个阶段我们将会分别侧重于编程技能的培养和对于变量的使用。

50,535

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧