Codeforces Round #555 (Div. 3) E. Minimum Array

题目链接:E. Minimum Array

题意:现在又两个等长为 n n n的数列 A A A B B B,你需要 n n n次在 A A A中按照顺序选一个元素, B B B中随意选一个元素,按组成数列 C C C C i = ( A i + B j ) C_{i} = (A_{i} + B_{j})%n Ci=(Ai+Bj)要求C的字典序最小。

解题心得:很简单的一个题,把数列 B B B升序排列,数列 A A A中的每一个数在 B B B中去找第一个大于等于 n − A i n-Ai nAi的数,如果没有就找 B B B的第一个数。



#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+100;

map <int, int> maps;//记录B数列每个数有多少个
int num[maxn], n;
vector <int> ans;
set <int> se;//把B按顺序放入
set <int> :: iterator iter;

void init() {
    scanf("%d", &n);
    for(int i=1;i<=n;i++) {
        scanf("%d", &num[i]);
    }

    for(int i=1;i<=n;i++) {
        int temp; scanf("%d", &temp);
        maps[temp]++;
        se.insert(temp);
    }
}



int main() {
    init();

    for(int i=1;i<=n;i++) {
        int now = num[i];
        iter = se.lower_bound(n-now);//找到第一个大于等于n-Ai的数
        if(iter == se.end()) {//没有就找第一个数
            iter = se.begin();
        }
        ans.push_back((now+(*iter))%n);
        maps[*iter]--;
        if(maps[*iter] == 0) {//这个数字已经用完
            se.erase(iter);
        }
    }

    for(int i=0;i<ans.size();i++) {
        printf("%d ", ans[i]);
    }

    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值