努力的人
题目
小亮来到了一个特殊的国度,这个国家的人有一个奇特的地方:如果一个人身边的人都比自己强,那么这个人会开始努力提升自己。
现在有n个人排成一排,因为视线是有限的,所以每个人只能看见左边的x个人和右边的y个人。每个人都有一个能力值ai,如果他视线能看到的人能力值都比他高,则他会开始努力提升自己。如果左边人数不足x个人,则左边的视线能看见左边所有人,如果右边没有y个人,那么右边的视线仅仅覆盖右边的所有人。
已知这n个人的编号从左到右为1~n,请问努力的人中最左边的人编号是多少。
保证这n个人的能力值都不重复,且都在10^6以内。
输入要求
输入第一行三个正整数空格隔开n, x, y含义如题。
第二行n个正整数空格隔开,表示n个人的能力值。
输出要求
输出一个正整数,即努力的人中最左边的编号是多少。
示例
输入
10 2 3
10 8 7 1 9 2 6 4 3 5
输出
4
思路
从当前位置分别向左右遍历,找到左边最小能力值和右边最小能力值,如果当前能力值小于左边也小于右边,则我需要努力,则当前就是最左边第一个需要提升自己的努力的人。
代码实现
java代码:
public class Power {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] num = sc.nextLine().split(" ");
int n = Integer.parseInt(num[0]);
int x = Integer.parseInt(num[1]);
int y = Integer.parseInt(num[2]);
int[] queue = new int[n];
String[] power = sc.nextLine().split(" ");
for (int i = 0; i < n; i++) {
queue[i] = Integer.parseInt(power[i]);
}
while (true) {
//每个人
for (int i = 0; i < n; i++) {
//左侧筛查
int lMin = Integer.MAX_VALUE;
int count = x;
for (int j = i - 1; j > -1 && count > 0; j--) {
lMin = queue[j] < lMin ? queue[j] : lMin;
count--;
}
//无左侧处理
if (lMin == Integer.MAX_VALUE) {
lMin = 0;
}
//右侧筛查
int rMin = Integer.MAX_VALUE;
count = y;
for (int j = i + 1; j < n && count > 0; j++) {
rMin = queue[j] < rMin ? queue[j] : rMin;
count--;
}
//无右侧处理
if (rMin == Integer.MAX_VALUE) {
rMin = 0;
}
//检测自己是否需要努力
if (queue[i] < lMin && queue[i] < rMin) {
System.out.println(i+1);
return;
}
}
}
}
}
有问题留言,转载注明出处,谢谢!