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

In one move, you can choose two indices ii and jj (1i,jn1 \le i, j \le n) and swap aia_i and bjb_j (i.e. aia_i becomes bjb_j and vice versa). Note that ii and jj can be equal or different (in particular, swap a2a_2 with b2b_2 or swap a3a_3 and b9b_9 both are acceptable moves).

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

You have to answer tt independent test cases.

1.3. Input

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

The first line of the test case contains two integers nn and kk (1n30;0kn1 \le n \le 30; 0 \le k \le n) — the number of elements in aa and bb and the maximum number of moves you can do. The second line of the test case contains nn integers a1,a2,,ana_1, a_2, \dots, a_n (1ai301 \le a_i \le 30), where aia_i is the ii-th element of aa. The third line of the test case contains nn integers b1,b2,,bnb_1, b_2, \dots, b_n (1bi301 \le b_i \le 30), where bib_i is the ii-th element of bb.

1.4. Onput

For each test case, print the answer — the maximum possible sum you can obtain in the array aa if you can do no more than (i.e. at most) kk 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 a1=1a_1 = 1 and b2=4b_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 a1=1a_1 = 1 and b1=10b_1 = 10, a3=3a_3 = 3 and b3=10b_3 = 10 and a2=2a_2 = 2 and b4=10b_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 aa and bb, 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. 解讀

aa 序列按照升序排序, 將 bb 按照降序排序。

依次遍歷 aa 序列中的所有元素,當 ai>bja_i > b_j時,將 aia_ibjb_j 交換,然後j=j+1j = 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,有問題歡迎通過郵箱交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章