题目说明
轮盘游戏被称为“赌场女王”。
庄家在转动的轮盘中投入滚珠,挑战者的神经跟随滚珠,
滚珠落入押注数字的那一刻,一本千金的迷幻梦境在心头挥之不去。
流传较广的轮盘数字排布和设计有“欧式规则”和“美式规则”两种。
下面我们要找出在这些规则下,“连续 n 个数字的和”最大的位置。
举个例子,当 n = 3 时,
按照欧式规则得到的和最大的组合是 36, 11, 30 这个组合,和为 77;
而美式规则下则是 24, 36, 13 这个组合,得到的和为 73欧式规则
0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27, 13, 36, 11, 30, 8, 23,
10, 5, 24, 16, 33, 1, 20, 14, 31, 9, 22, 18, 29, 7, 28, 12, 35, 3, 26美式规则
0, 28, 9, 26, 30, 11, 7, 20, 32, 17, 5, 22, 34, 15, 3, 24, 36, 13, 1,
00, 27, 10, 25, 29, 12, 8, 19, 31, 18, 6, 21, 33, 16, 4, 23, 35, 14, 2当2 <= n <= 36 时,求连续 n 个数之和最大的情况,
并找出满足条件“欧式规则下的和小于美式规则下的和”的 n 的个数。
思路
1.两个数组分别保存两种规则的数字
2.分别计算n在2~36时,两种规则下的最大值
3.比较最大值,统计欧<美的个数
代码
public static void main(String[] args) {
// 欧式规则
int[] eu = {0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27, 13, 36, 11, 30, 8, 23, 10, 5, 24, 16, 33, 1, 20, 14, 31, 9, 22, 18, 29, 7, 28, 12, 35, 3, 26};
// 美式规则
int[] am = {0, 28, 9, 26, 30, 11, 7, 20, 32, 17, 5, 22, 34, 15, 3, 24, 36, 13, 1, 00, 27, 10, 25, 29, 12, 8, 19, 31, 18, 6, 21, 33, 16, 4, 23, 35, 14, 2};
// 统计最终n的个数
int count = 0;
// 分别计算n在2~36时,两种规则下的最大值
for(int n = 2; n <= 36; n ++){
int euMax = findMax(eu,n);
int amMax = findMax(am,n);
if(euMax < amMax){
count ++;
}
}
System.out.println("count = " + count);
}
/**
* 求指定数组arr中,连续n个元素(首位相连)的最大值
* @param arr 给定的数组
* @param n n个元素
* @return n个元素的最大值
*/
public static int findMax(int[] arr, int n){
if(arr == null || n <= 0 || n > arr.length) {
throw new IllegalArgumentException("入参不合法!");
}
int max = 0;
for(int i = 0; i < n; i ++){
max += arr[i]; // 计算前n个元素的和
}
int tmp = max; // 统计连续n个数的最大值
for(int i = 0; i < arr.length; i ++){
tmp -= arr[i]; // 最前面减去一个值
tmp += arr[(i+n) % arr.length]; // 最后面加上一个值,相当于连续n个元素的范围从[i,i+n-1]变成了[i+1,i+n] (此处仅作范围变化的说明,忽略越界情况。越界情况取余即可)
if(tmp > max){
max = tmp;
}
}
return max;
}
结果
count = 9