✨ que red package
parent
e90ac4edbe
commit
e224fbae0c
@ -0,0 +1,48 @@
|
|||||||
|
package org.alis.smallcc.algorithm.redpackage;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 红包算法只
|
||||||
|
* 双倍平均算法
|
||||||
|
* <p>
|
||||||
|
* 红包的最小单位是分 所以这里需要执行乘100的倍数
|
||||||
|
*
|
||||||
|
* @author robin
|
||||||
|
* @date 2022/2/7 10:22
|
||||||
|
*/
|
||||||
|
public class DoubleDivide {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
dividePackage(10000, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 双倍算法
|
||||||
|
*
|
||||||
|
* @param total 总金额
|
||||||
|
* @param count 总份数
|
||||||
|
*/
|
||||||
|
private static void dividePackage(Integer total, Integer count) {
|
||||||
|
int temp = count;
|
||||||
|
int endCount = 0;
|
||||||
|
int min = 1;
|
||||||
|
for (int i = 1; i <= temp; i++) {
|
||||||
|
int amount;
|
||||||
|
if (i == temp) {
|
||||||
|
amount = total;
|
||||||
|
} else {
|
||||||
|
amount = Math.max(min, ThreadLocalRandom.current().nextInt(total / count * 2 - 1) + 1 - min);
|
||||||
|
}
|
||||||
|
total -= amount;
|
||||||
|
count--;
|
||||||
|
System.out.printf("第%d 个人抢到了 %f 元%n", i, (float) amount / 100);
|
||||||
|
endCount += amount;
|
||||||
|
}
|
||||||
|
System.out.printf("红包的总数是%d %n", endCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package org.alis.smallcc.algorithm.redpackage;
|
||||||
|
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 随机红包
|
||||||
|
* 前几名拿高额钱包一定是最大的
|
||||||
|
*
|
||||||
|
* @author robin
|
||||||
|
* @date 2022/2/7 10:54
|
||||||
|
*/
|
||||||
|
public class RandomRedPackage {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
random(10000, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void random(Integer total, Integer count) {
|
||||||
|
int min = 1;
|
||||||
|
for (int i = 1; i <= count; i++) {
|
||||||
|
int amount;
|
||||||
|
if (i == count) {
|
||||||
|
amount = total;
|
||||||
|
} else {
|
||||||
|
amount = Math.max(min, ThreadLocalRandom.current().nextInt(total - 1) + 1 - min);
|
||||||
|
}
|
||||||
|
total -= amount;
|
||||||
|
System.out.printf("第%d 个人抢到了 %f 元%n", i, (float) amount / 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
package org.alis.smallcc.algorithm.redpackage;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分段
|
||||||
|
* 线段切割算法
|
||||||
|
*
|
||||||
|
* @author robin
|
||||||
|
* @date 2022/2/7 11:32
|
||||||
|
*/
|
||||||
|
public class SegmentRedPackage {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
List<Integer> integers = lineCut(10000, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<Integer> lineCut(int money, int people) {
|
||||||
|
|
||||||
|
if (money < 1 || people < 1 || money < people) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Integer> team = new ArrayList<>(people - 1);
|
||||||
|
List<Integer> result = new ArrayList<>(people);
|
||||||
|
|
||||||
|
Random random = new Random();
|
||||||
|
while (team.size() < people - 1) {
|
||||||
|
int randomMoney = random.nextInt(money) + 1;
|
||||||
|
if (!team.contains(randomMoney)) {
|
||||||
|
team.add(randomMoney);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Collections.sort(team);
|
||||||
|
|
||||||
|
System.out.print("分割点:");
|
||||||
|
System.out.println(team.stream().map(Integer::floatValue).map(f->f/100).collect(Collectors.toList()));
|
||||||
|
|
||||||
|
int left = 0;
|
||||||
|
for (Integer integer : team) {
|
||||||
|
result.add(integer - left);
|
||||||
|
left = integer;
|
||||||
|
}
|
||||||
|
result.add(money - left);
|
||||||
|
|
||||||
|
System.out.print("每人金额:");
|
||||||
|
System.out.println(result.stream().map(Integer::floatValue).map(f->f/100).collect(Collectors.toList()));
|
||||||
|
|
||||||
|
// 验证分割后的数是否是输入的总金额
|
||||||
|
result.stream().reduce(Integer::sum).ifPresent(amount -> {
|
||||||
|
System.out.print("总金额:");
|
||||||
|
System.out.println(amount);
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue