【微众银行机试题】(2022.4.11)努力的人

努力的人

题目

小亮来到了一个特殊的国度,这个国家的人有一个奇特的地方:如果一个人身边的人都比自己强,那么这个人会开始努力提升自己。
现在有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;
                }
            }
        }
    }
}

有问题留言,转载注明出处,谢谢!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值