CodeForces 1353 B. Two Arrays And Swaps 贪心算法

1. 题目描述

1.1. Limit

Time Limit: 1 second

Memory Limit: 256 megabytes

1.2. Problem Description

You are given two arrays a a and b b both consisting of n n positive (greater than zero) integers. You are also given an integer k k .

In one move, you can choose two indices i i and j j ( 1 i , j n 1 \le i, j \le n ) and swap a i a_i and b j b_j (i.e. a i a_i becomes b j b_j and vice versa). Note that i i and j j can be equal or different (in particular, swap a 2 a_2 with b 2 b_2 or swap a 3 a_3 and b 9 b_9 both are acceptable moves).

Your task is to find the maximum possible sum you can obtain in the array a a if you can do no more than (i.e. at most) k k such moves (swaps).

You have to answer t t independent test cases.

1.3. Input

The first line of the input contains one integer t t ( 1 t 200 1 \le t \le 200 ) — the number of test cases. Then t t test cases follow.

The first line of the test case contains two integers n n and k k ( 1 n 30 ; 0 k n 1 \le n \le 30; 0 \le k \le n ) — the number of elements in a a and b b and the maximum number of moves you can do. The second line of the test case contains n n integers a 1 , a 2 , , a n a_1, a_2, \dots, a_n ( 1 a i 30 1 \le a_i \le 30 ), where a i a_i is the i i -th element of a a . The third line of the test case contains n n integers b 1 , b 2 , , b n b_1, b_2, \dots, b_n ( 1 b i 30 1 \le b_i \le 30 ), where b i b_i is the i i -th element of b b .

1.4. Onput

For each test case, print the answer — the maximum possible sum you can obtain in the array a a if you can do no more than (i.e. at most) k k swaps.

1.5. Sample Input

5
2 1
1 2
3 4
5 5
5 5 6 6 5
1 2 5 4 3
5 3
1 2 3 4 5
10 9 10 10 9
4 0
2 2 4 3
2 4 2 3
4 4
1 2 2 1
4 4 5 4

1.6. Sample Onput

6
27
39
11
17

1.7. Note

In the first test case of the example, you can swap a 1 = 1 a_1 = 1 and b 2 = 4 b_2 = 4 , so a = [ 4 , 2 ] a=[4, 2] and b = [ 3 , 1 ] b=[3, 1] .

In the second test case of the example, you don’t need to swap anything.

In the third test case of the example, you can swap a 1 = 1 a_1 = 1 and b 1 = 10 b_1 = 10 , a 3 = 3 a_3 = 3 and b 3 = 10 b_3 = 10 and a 2 = 2 a_2 = 2 and b 4 = 10 b_4 = 10 , so a = [ 10 , 10 , 10 , 4 , 5 ] a=[10, 10, 10, 4, 5] and b = [ 1 , 9 , 3 , 2 , 9 ] b=[1, 9, 3, 2, 9] .

In the fourth test case of the example, you cannot swap anything.

In the fifth test case of the example, you can swap arrays a a and b b , so a = [ 4 , 4 , 5 , 4 ] a=[4, 4, 5, 4] and b = [ 1 , 2 , 2 , 1 ] b=[1, 2, 2, 1] .

1.8. Source

CodeForces 1353 B. Two Arrays And Swaps


2. 解读

a a 序列按照升序排序, 将 b b 按照降序排序。

依次遍历 a a 序列中的所有元素,当 a i > b j a_i > b_j 时,将 a i a_i b j b_j 交换,然后 j = j + 1 j = j + 1

3. 代码

#include <algorithm>
#include <iostream>
#include <string.h>
const long long num = 1e2 + 1;
using namespace std;

long long listA[num];
long long listB[num];

// 交换元素
void mySwap(long long& a, long long& b)
{
    long long &c = b;
    b = a;
    a = c;
}
// 降序排列
int cmp(long long a, long long b)
{
    return a > b;
}

int main()
{
    // test case
    long long t;
    long long n, k;
    long long ans = 0;
    long long markA, markB;
    // test case
    scanf("%lld", &t);
    // for each test case
    while (t--) {
        scanf("%lld %lld", &n, &k);
        // 初始化
        memset(listA, 0, sizeof(listA));
        memset(listB, 0, sizeof(listB));
        ans = markA = markB = 0;
        // 输入
        for (int i = 0; i < n; i++)
            scanf("%lld", &listA[i]);
        for (int i = 0; i < n; i++)
            scanf("%lld", &listB[i]);
        // 排序,A升序B降序
        sort(listA, listA + n);
        sort(listB, listB + n, cmp);
        // 交换
        for (int i = 0; i < k; i++) {
            if (listA[i] < listB[markB]){
                mySwap(listA[i], listB[markB]);
                markB++;
            }
        }

        // 求和
        for (int i = 0; i < n; i++)
            ans += listA[i];

        printf("%lld\n", ans);
    }
}

联系邮箱:[email protected]

Github:https://github.com/CurrenWong

欢迎转载/Star/Fork,有问题欢迎通过邮箱交流。

猜你喜欢

转载自blog.csdn.net/qq_41729780/article/details/106178199