首页 > 试题广场 >

分糖果问题进阶问题

[编程题]分糖果问题进阶问题
  • 热度指数:780 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:
1. 每个孩子不管得分多少,起码分到一个糖果。
2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。
3. 任意两个相邻的孩子之间的得分如果一样多,糖果数必须相同
给定一个数组arr代表得分数组,请返回最少需要多少糖果。


输入描述:
第一行一个整数N表示数组大小
接下来一行N个整数表示数组内的元素


输出描述:
输出一个整数表示答案
示例1

输入

3
1 2 2

输出

5

说明

最优分配方案为1, 2, 2
示例2

输入

13
0 1 2 3 3 3 2 2 2 2 2 1 1

输出

30

说明

最优的分配方案为
1 2 3 4 4 4 2 2 2 2 2 1 1

备注:
public class Main {
 public static void main(String[] args) {
  Scanner in = new Scanner(System.in);
  String array_len = in.nextLine();
  // 获取数组长度
  int[] score = new int[Integer.parseInt(array_len)];
  String aString = in.nextLine();
  String[] a = aString.split(" ");
  // 获取分数数组
  for (int i = 0; i < a.length; i++) {
   score[i] = Integer.parseInt(a[i]);
  }
System.out.println(cal_min_candy(score));
 }
 public static int cal_min_candy(int[] a) {
     int[] temp=new int[a.length];
     Arrays.fill(temp, 1);
     //右看一下,发现比自己小的就比小的多一个
     for(int j=1;j<temp.length;j++) {
      if(a[j]>a[j-1]) {
       temp[j]=temp[j-1]+1;
      }
      else if(a[j]==a[j-1]) {
       temp[j]=Math.max(temp[j], temp[j-1]);
  }
      
     }
     //左看一下,发现比自己小且糖果比自己多的,就比小的多一个
     for(int j=temp.length-2;j>=0;j--) {
      if(a[j]>a[j+1]&&temp[j]<=temp[j+1]) {
           temp[j]=temp[j+1]+1;
      }
      else if (a[j]==a[j+1]) {
       temp[j]=Math.max(temp[j], temp[j+1]);
   }
      
     
    }
     
     return sunArray(temp);
 }
 public static int sunArray(int[] a) {
  int sum = 0;
  for (int i = 0; i < a.length; i++) {
   sum += a[i];
  }
  return sum;
 }
}
发表于 2020-02-17 11:56:58 回复(0)

问题信息

上传者:小小
难度:
1条回答 5231浏览

热门推荐

通过挑战的用户

查看代码
分糖果问题进阶问题