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

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

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

You have to answer t t t independent test cases.

1.3. Input

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

The first line of the test case contains two integers n n n and k k k ( 1 ≤ n ≤ 30 ; 0 ≤ k ≤ n 1 \le n \le 30; 0 \le k \le n 1n30;0kn) — the number of elements in a a a and b b b and the maximum number of moves you can do. The second line of the test case contains n n n integers a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,,an ( 1 ≤ a i ≤ 30 1 \le a_i \le 30 1ai30), where a i a_i ai is the i i i-th element of a a a. The third line of the test case contains n n n integers b 1 , b 2 , … , b n b_1, b_2, \dots, b_n b1,b2,,bn ( 1 ≤ b i ≤ 30 1 \le b_i \le 30 1bi30), where b i b_i bi is the i i i-th element of b b b.

1.4. Onput

For each test case, print the answer — the maximum possible sum you can obtain in the array a a a if you can do no more than (i.e. at most) k 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 a1=1 and b 2 = 4 b_2 = 4 b2=4, so a = [ 4 , 2 ] a=[4, 2] a=[4,2] and b = [ 3 , 1 ] 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 a1=1 and b 1 = 10 b_1 = 10 b1=10, a 3 = 3 a_3 = 3 a3=3 and b 3 = 10 b_3 = 10 b3=10 and a 2 = 2 a_2 = 2 a2=2 and b 4 = 10 b_4 = 10 b4=10, so a = [ 10 , 10 , 10 , 4 , 5 ] 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] 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 a and b b b, so a = [ 4 , 4 , 5 , 4 ] a=[4, 4, 5, 4] a=[4,4,5,4] and b = [ 1 , 2 , 2 , 1 ] b=[1, 2, 2, 1] b=[1,2,2,1].

1.8. Source

CodeForces 1353 B. Two Arrays And Swaps


2. 解读

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

依次遍历 a a a 序列中的所有元素,当 a i > b j a_i > b_j ai>bj时,将 a i a_i ai b j b_j bj 交换,然后 j = j + 1 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);
    }
}

联系邮箱:curren_wong@163.com

Github:https://github.com/CurrenWong

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值