原题链接

题目描述

给定一个长度为 nAn_A 的非降序整数数组 AA 和一个长度为 nBn_B 的非降序整数数组 BB

请问,能否从 AA 中挑选 kk 个数,从 BB 中挑选 mm 个数,使得在 AA 中挑选出的任何数都严格小于在 BB 中挑选出的任何数。

输入格式

第一行包含两个整数 nA,nBn_A,n_B

第二行包含两个整数 k,mk,m

第三行包含 nAn_A 个整数 a1,a2,,anAa_1,a_2,…,a_{nA}

第四行包含 nBn_B 个整数 b1,b2,,bnBb_1,b_2,…,b_{nB}

输出格式

共一行,能则输出 YES,否则输出 NO

数据范围

1nA,nB1051≤nA,nB≤10^5,
1knA1≤k≤n_A,
1mnB1≤m≤n_B,
109ai,bi109-10^9≤a_i,b_i≤10^9
保证 AABB 都是非降序数组。

样例

输入样例1:

3 3
2 1
1 2 3
3 4 5

输出样例1:

YES

输入样例2:

3 3
3 3
1 2 3
3 4 5

输出样例2:

NO

输入样例3:

5 2
3 1
1 1 1 1 1
2 2

输出样例3:

YES

思路

非降序数组,可能是升序数组(我交的时候是升序数组,WA了排个序就行)。

这里 AABB 都是升序数组,题意是要从 AA 中选 kk 个数,都严格小于 BB 中选 mm 的个数。贪心的思想,选 AA 数组中最小的 kk 个数,选 BB 数组中最大的 mm 个数即可。

这里只要比较 Ak1A_{k - 1}BnmB_{n - m} 的大小即可。按照前面的思想,Ak1A_{k - 1}AA 中选出来的最大值, BnmB_{n-m}BB 中选出来的最小值 。

代码

C++

#include <iostream>

using namespace std;

const int N = 1e5 + 5;

int A[N], B[N];

int main()
{
    int a, b, k, m;
    scanf("%d %d %d %d", &a, &b, &k, &m);
    for ( int i = 0; i < a; i ++ ) scanf("%d", &A[i]);
    for ( int i = 0; i < b; i ++ ) scanf("%d", &B[i]);
    printf("%s\n", A[k - 1] < B[b - m] ? "YES" : "NO");
    return 0;
}

Java

import java.util.*;

public class Main
{
    private static Scanner in = new Scanner(System.in);
    private static final int N = (int) (1e5) + 5;
    private static int A[] = new int[N], B[] = new int[N];
    
    public static void main(String args[])
    {
        int a = in.nextInt(), b = in.nextInt(), k = in.nextInt(), m = in.nextInt();
        for ( int i = 0; i < a; i ++ ) A[i] = in.nextInt();
        for ( int i = 0; i < b; i ++ ) B[i] = in.nextInt();
        System.out.printf("%s\n", A[k - 1] < B[b - m] ? "YES" : "NO");
    }
}