/**
* 已知一个计算范围内等概率的方法,求另外一个范围的等概率返回。
*/
public class CalculateProbability {
public static void main(String[] args) {
//已知0-5上的概率为fn,求30-39上的概率
// 1 将0-5上的概率包装成0和1等概率返回。如果是p和p-1也是同样的道理,包装成01和10等概率返回,其它继续。
// 30-39可以看成 0-8的概率最后+1
for(int i = 0; i < 50; i++){
System.out.println(getRandomRes());
}
}
private static int getRandomRes(){
int res = 0;
do{
res = (zeroAndOne() << 3) + (zeroAndOne() << 2) + (zeroAndOne() << 1) + zeroAndOne();
}while (res == 9 || res == 10 || res == 11 || res == 12 || res == 13 || res == 14 || res == 15 || res == 16);
return res + 1 + 30;
}
/**
* 等概率返回0和1
* @return
*/
private static int zeroAndOne(){
int res = 0;
do{
res = fn();
}while (res == 4);
return res % 2;
}
/**
* 0-5上的概率,题目给的函数
* @return
*/
private static int fn(){
Random ran = new Random();
return ran.nextInt(5);
}
}
/**
* 问题描述
* 数轴上从左到右有n各点a[0],a[1],……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
* 先输入绳子的长度,然后输入数轴上的点,点以逗号分割,数值是有序的。
*
* 算法:滑动窗口
*/
public class SlidingWindow {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int len = Integer.parseInt(sc.nextLine());
String[] points = sc.nextLine().split(",");
int maxSize = getMaxCoverPointNum(len, points);
System.out.println(maxSize);
}
}
private static int getMaxCoverPointNum(int len, String[] points){
int[] sizeArr = new int[points.length];
int size = 0;
// 窗口左侧
int l = 0;
//窗口右侧
int r = 0;
while(r < points.length){
//窗口左边的数
int cur = Integer.parseInt(points[l]);
//窗口右边的数
int next = Integer.parseInt(points[r]);
//如果下一点能够cover长度的话,那么r右移一位,数量加1.继续
if(len >= (next -cur)){
++size;
++r;
sizeArr[l] = size;
continue;
}else{
//记录下当前l能cover几个点,l右移动一位,同时r也要充值为l,个数重置为0
sizeArr[l] = size;
++l;
r = l;
size = 0;
}
}
Arrays.sort(sizeArr);
return sizeArr[sizeArr.length-1];
}
}