分糖果问题(上坡和下破问题)

翻译 2018年04月17日 21:00:40

这里写图片描述

//分糖果问题(上坡和下破问题)
public class CandyProblem{

     //(1)原问题
     public static int Candy1(int[]arr)
     {
          if(arr==null||arr.length==0)
          {
              return 0;
          }
          int index=nextMinIndex1(arr,0);
          int res= rightCands(arr,0,index++);
          int lbase=1;
          int next=0;
          int rcands=0;
          int rbase=0;

          while(index!=arr.length)
          {
               if(arr[index]>arr[index-1])
               {
                    res+=++lbase;
                    index++;
               }else if(arr[index]<arr[index-1])
               {
                   next=nextMinIndex1(arr,index-1);
                   rcands=rightCands(arr,index-1,next++);
                   rbase=next-index+1;
                   res+=rcands+(rbase>lbase?-lbase:-rbase);
                   lbase=1;
                   index=next;
               }else{

                   res+=1;
                   lbase=1;
                   index++;
               }
          }
          return res;
     } 

     public static int nextMinIndex1(int[]arr,int start)
     {
         for(int  i=start;i!=arr.length-1;i++)
         {
              if(arr[i]<=arr[i+1])
              {
                return i;
              }
         }
         return arr.length-1;
     }

     public static int rightCands(int[]arr,int left,int right){

          int n=right-left+1;
          return n+n*(n-1)/2;
     }

     //**********************进阶问题**************************
     public static int candy2(int[] arr) {
        if (arr == null || arr.length == 0) {
            return 0;
        }
        int index = nextMinIndex2(arr, 0);
        int[] data = rightCandsAndBase(arr, 0, index++);
        int res = data[0];
        int lbase = 1;
        int same = 1;
        int next = 0;
        while (index != arr.length) {
            if (arr[index] > arr[index - 1]) {
                res += ++lbase;
                same = 1;
                index++;
            } else if (arr[index] < arr[index - 1]) {
                next = nextMinIndex2(arr, index - 1);
                data = rightCandsAndBase(arr, index - 1, next++);
                if (data[1] <= lbase) {
                    res += data[0] - data[1];
                } else {
                    res += -lbase * same + data[0] - data[1] + data[1] * same;
                }
                index = next;
                lbase = 1;
                same = 1;
            } else {
                res += lbase;
                same++;
                index++;
            }
        }
        return res;
    }

    public static int nextMinIndex2(int[] arr, int start) {
        for (int i = start; i != arr.length - 1; i++) {
            if (arr[i] < arr[i + 1]) {
                return i;
            }
        }
        return arr.length - 1;
    }

    public static int[] rightCandsAndBase(int[] arr, int left, int right) {
        int base = 1;
        int cands = 1;
        for (int i = right - 1; i >= left; i--) {
            if (arr[i] == arr[i + 1]) {
                cands += base;
            } else {
                cands += ++base;
            }
        }
        return new int[] { cands, base };
    }
     public static void main(String[]args)
     { 
         //System.out.println("Hello");
         //原问题
         int[] test1 = { 3, 0, 5, 5, 4, 4, 0 };
         System.out.println(Candy1(test1));

        //进阶问题
        int[] test2 = { 3, 0, 5, 5, 4, 4, 0 };
        System.out.println(candy2(test2));

     }
}

这里写图片描述

[LeetCode]—Candy 分糖果问题

Candy
  • SUN20082567
  • SUN20082567
  • 2014-06-30 14:03:59
  • 1342

Leetcode 之Candy 分糖果问题。

题目: There are N children standing in a line. Each child is assigned a rating value. You are giving...
  • Al_xin
  • Al_xin
  • 2014-09-08 11:23:16
  • 868

蓝桥杯 2014年javaB组 编程题 分糖果问题

标题:分糖果     有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:     每个小朋友都把自己的糖果分一半给左手边的孩子。     一轮分糖后,拥有...
  • u010308577
  • u010308577
  • 2014-04-11 21:14:35
  • 1105

2.3趣味数学之分糖果问题

1.问题描述 2.问题分析 3算法设计 4程序框架 5完整程序int judge(int sw[]);//判断每个孩子的手中糖果是否一致 void print(int...
  • lcg910978041
  • lcg910978041
  • 2016-03-30 16:13:53
  • 348

LeetCode-135. Candy (JAVA)根据等级分糖果

LeetCode-135. Candy (JAVA)根据等级分糖果
  • mine_song
  • mine_song
  • 2017-04-11 13:08:38
  • 261

lintcode(412)分糖果

Description: 有 N 个小孩站成一列。每个小孩有一个评级。 按照以下要求,给小孩分糖果: 每个小孩至少得到一颗糖果。  评级越高的小孩可以得到更多的糖果。 ...
  • sunday0904
  • sunday0904
  • 2017-06-10 08:42:45
  • 240

分糖果问题(java)

10个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩2...
  • u014430697
  • u014430697
  • 2015-12-05 19:47:25
  • 1062

python求解按等级分配糖果问题

问题: 有n个人,每个人有一定的优先等级,等级高的人要比身边等级低得人得到的多,每个人都不会分不到 思路: 可以采用两头遍历的方法,顺序遍历保证等级高的人会比左边的人多,倒序遍历可以保证等级高的...
  • Together_CZ
  • Together_CZ
  • 2017-08-03 11:04:13
  • 440

贪心算法之分糖果

前几天一位同学向我推荐了一道算法题,想了一会觉得思路有了,然后某天晚上想把代码撸出来,然后没想到的是:“一入此题深似海,从此头发是路人”。 ———————————————————————## 标题 #...
  • Seanseattl
  • Seanseattl
  • 2017-04-05 21:51:14
  • 979

GEEK编程练习— —发糖果问题

题目假设N个小孩站成一排,每个小孩被分配了一个整数号码。要按照如下的要求给孩子们发糖。 1、每个小孩至少有一颗糖果 2、号码大的孩子比相邻的孩子分到的糖果要多 求最少要发出几颗糖果输入0 1 3...
  • lyh03601
  • lyh03601
  • 2016-06-01 22:41:38
  • 4162
收藏助手
不良信息举报
您举报文章:分糖果问题(上坡和下破问题)
举报原因:
原因补充:

(最多只允许输入30个字)