【孩子分糖】

来源:互联网 发布:spring boot源码分析 编辑:程序博客网 时间:2024/05/01 08:44
/*
 * 原问题:N个孩子站成一排,每个人分给一个权重。按照如下的规则分配糖果: 每个孩子至少有一个糖果;所分配权重较高的孩子,
 * 会比他的邻居获得更多的糖果。 问题是,最少需要多少个糖果?关注微信公众账号“待字闺中”,了解更多。
 * 
 * 分析:每个孩子相对他左右邻居的权重,只有4种确定情形:左低右高,左高右高,左高右低,
 * 左低右低(若权重相等则分配数量相等的糖果即可)。对左低右高的情形,当前权重为他的左邻权重;
 * 左高右高则当前权重为1;左高右低当前权重为他的右邻权重(递归处理),左低右低当前权重为左右邻的较大值(动态规划处理)
 * */
public class Solution1 {


public int candy(int[] ratings) {
if(ratings.length==1)return 1;
if(ratings.length==2)return ratings[0]==ratings[1]?2:3;
A s = new A();
s.a = ratings;
s.run();
int sum = 0;
for (int j = 0; j < s.a.length; j++) {
sum += s.a[j];
}
return sum;
}


public static void main(String[] args) {
Solution1 s = new Solution1();
int b = (int) (Math.random() * 30);
int[] c = new int[b];for (int j = 0; j < c.length; j++)c[j] = (int) (Math.random() * 30);
System.out.println("初始随机权重数组:");
for (int j = 0; j < c.length; j++)
System.out.print(c[j] + ",");
System.out.println();
if (c.length <= 1) {
return;
}
System.out.println("糖果总数:" + s.candy(c));
System.out.println("权值数组对应的糖果分配方案:");
for (int j = 0; j < c.length; j++)
System.out.print(c[j] + ",");
}
}


class A {
int[] a = {};
int _Lneighborweight = 0;
int k = 0;


int value(int i) {
//System.out.println(i);
if (i == 0) {
k++;
if (a[0] < a[1]) {
_Lneighborweight = a[0];
a[0] = 1;
} else if (a[0] > a[1]) {
_Lneighborweight = a[0];
a[0] = value(1) + 1;
if(a[0]<=0)a[0]=1;


} else {
a[0] = 1;
_Lneighborweight = a[0];
}
} else if (i == a.length - 1) {
k++;


if (a[i] <=_Lneighborweight) {
a[i] = 1;
} else {
a[i] = a[i - 1] + 1;
}
} else if (a[i] <= _Lneighborweight && (a[i] < a[i + 1]|| a[i] == a[i + 1])) {//V L


_Lneighborweight = a[i];
k++;
a[i] = 1;
} else if (a[i] > _Lneighborweight && (a[i] < a[i + 1]||a[i] == a[i + 1] )) {//  /  厂  
k++;
_Lneighborweight = a[i];
a[i] = a[i - 1] + 1;


} else if (a[i] > _Lneighborweight && a[i] > a[i + 1]) {// A
k++;
_Lneighborweight = a[i];
int r = value(i + 1);
a[i] = ((a[i - 1] > r) ? a[i - 1] + 1 : r + 1);
} else if (a[i] <= _Lneighborweight && a[i] > a[i + 1]) {// \
k++;
_Lneighborweight = a[i];
a[i] = value(i + 1) + 1;

return a[i];
}


void run() {
for (; this.k < this.a.length;) {
this.value(k);
}
}
}



运行结果


原创粉丝点击