欢乐暑假线上编程比赛第四题:分配糖果 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;
}
}
}

求一个让代码运行错误的测试用例
...全文
356 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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个糖果为止。

51,396

社区成员

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

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