Skip to content

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 and both consisting of positive (greater than zero) integers. You are also given an integer .

In one move, you can choose two indices and () and swap and (i.e. becomes and vice versa). Note that and can be equal or different (in particular, swap with or swap and both are acceptable moves).

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

You have to answer independent test cases.

1.3. Input#

The first line of the input contains one integer () — the number of test cases. Then test cases follow.

The first line of the test case contains two integers and () — the number of elements in and and the maximum number of moves you can do. The second line of the test case contains integers (), where is the -th element of . The third line of the test case contains integers (), where is the -th element of .

1.4. Onput#

For each test case, print the answer — the maximum possible sum you can obtain in the array if you can do no more than (i.e. at most) 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 and , so and .

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 and , and and and , so and .

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

In the fifth test case of the example, you can swap arrays and , so and .

1.8. Source#

CodeForces 1353 B. Two Arrays And Swaps


2. 解读#

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

依次遍历 序列中的所有元素,当 时,将 交换,然后

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);
    }
}

联系邮箱:curren_wong@163.com

Github:https://github.com/CurrenWong

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

Back to top