Codeforces Round 916 (Div. 3) D. Three Activities (sb模拟)

寒假即将来临。它们将持续 n 天。

在假期里,莫诺卡普想和他的朋友们把所有这些活动尝试一次:

去滑雪去电影院看电影玩棋盘游戏。Monocarp 知道,在 i //这一天,正好有 ai 个朋友和他一起去滑雪, bi 个朋友和他一起去看电影, ci 个朋友和他一起去玩棋盘游戏。

Monocarp 还知道,他不能在一天内尝试超过一项活动。

因此,他要求你帮他选择三个不同的天 x,y,z ,使参加活动的朋友总数( ax+by+cz )达到最大。

输入
第一行包含一个整数 t ( 1≤t≤104 ) - 测试用例数。

每个测试用例的第一行包含一个整数 n ( 3≤n≤105 ) - 以天为单位的寒假持续时间。

第二行包含 n 个整数 a1,a2,…,an ( 1≤ai≤108 )–在 i --这一天与 Monocarp 一起滑雪的朋友人数。

第三行包含 n 个整数 b1,b2,…,bn ( 1≤bi≤108 )。

第四行包含 n 个整数 c1,c2,…,cn ( 1≤ci≤108 )–将在 i -th这一天和 Monocarp 一起玩桌游的朋友人数。

所有测试案例中 n 的总和不会超过 105 。

输出
针对每个测试用例,打印一个整数,即在三个不同的日子里可以参加 Monocarp 活动的朋友的最大总数。


可以记录下来三个数组中各自最大的三个元素的下标,然后去枚举这些元素组合所有的合理情况,然后取最大值。

因为每个数组三个最大值能够组成所有可能的最优情况,比如对于一个数组来说,如果最大的两个都被选了,那么现在选第三个最大的就是最优情况。


CODE:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
#define pii pair<int,int>

int a[N];
int b[N];
int c[N];

void solve(){
    int n;cin >> n;
    for(int i = 1;i <= n;i++)cin >> a[i];
    for(int i = 1;i <= n;i++)cin >> b[i];
    for(int i = 1;i <= n;i++)cin >> c[i];

    int a1 = -1,a2 = -1,a3 = -1;
    for(int i = 1;i <= n;i++){
        if(a1 == -1 || a[i] > a[a1]){
            a3 = a2;
            a2 = a1;
            a1 = i;
        }else if(a2 == -1 || a[i] > a[a2]){
            a3 = a2;
            a2 = i;
        }else if(a3 == -1 || a[i] > a[a3]){
            a3 = i;
        }
    }

    int c1 = -1,c2 = -1,c3 = -1;
    for(int i = 1;i <= n;i++){
        if(c1 == -1 || c[i] > c[c1]){
            c3 = c2;
            c2 = c1;
            c1 = i;
        }else if(c2 == -1 || c[i] > c[c2]){
            c3 = c2;
            c2 = i;
        }else if(c3 == -1 || c[i] > c[c3]){
            c3 = i;
        }
    }

    int b1 = -1,b2 = -1,b3 = -1;
    for(int i = 1;i <= n;i++){
        if(b1 == -1 || b[i] > b[b1]){
            b3 = b2;
            b2 = b1;
            b1 = i;
        }else if(b2 == -1 || b[i] > b[b2]){
            b3 = b2;
            b2 = i;
        }else if(b3 == -1 || b[i] > b[b3]){
            b3 = i;
        }
    }

    vector<int>posA(3);
    posA[0] = a1,posA[1] = a2,posA[2] = a3;
    vector<int>posB(3);
    posB[0] = b1,posB[1] = b2,posB[2] = b3;
    vector<int>posC(3);
    posC[0] = c1,posC[1] = c2,posC[2] = c3;

    int res = 0;
    for(int i = 0;i < 3;i++){
        for(int j = 0;j < 3;j++){
            for(int k = 0;k < 3;k++){
                int aa = posA[i],bb = posB[j],cc = posC[k];
                if(aa != bb && aa != cc && bb != cc){
                    res = max(res,a[aa] + b[bb] + c[cc]);
                }
            }
        }
    }
    
    cout << res << endl;
}

int main(){
    int T;cin >> T;
    while(T--){
        solve();
    }
    return 0;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值