题目链接: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 n−Ai的数,如果没有就找 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;
}