E. Minimum Array(贪心)
题目链接:https://codeforces.com/problemset/problem/1157/E
题目大意:
首先输入一个n,然后输入a数组,有n个数。然后输入b数组,也有n个数。然后你可以对b数组进行排序,使得(a[i]+b[i])%n从1~n的字典序最小。
具体思路:
通过分析数据范围,我们可以知道两个数相加凑出来n是最合理的,对于当前的数t1,我们要找的是 n-t1 ,如果没有就找n-t2,如果到n还没有,就从0开始凑。
(貌似set自带的二分好像比普通的lower_bound(三个参数)更优秀,如果是普通的lower_bound就给T了)
AC代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 # define ll long long
4 const int maxn = 2e5+100;
5 vector<int>sto;
6 multiset<int>b;
7 int ans[maxn];
8 int main()
9 {
10 int n;
11 scanf("%d",&n);
12 for(int i=0; i<n; i++)
13 {
14 int tmp;
15 scanf("%d",&tmp);
16 sto.push_back(tmp);
17 }
18 for(int i=0; i<n; i++)
19 {
20 int tmp;
21 scanf("%d",&tmp);
22 b.insert(tmp);
23 }
24 for(int i=0; i<n; i++)
25 {
26 auto u=b.lower_bound(n-sto[i]);
27 if(u==b.end())
28 u=b.begin();
29 ans[i]=(*u+sto[i])%n;
30 b.erase(u);
31 }
32 for(int i=0; i<n; i++)
33 {
34 if(i==0)
35 printf("%d",ans[i]);
36 else
37 printf(" %d",ans[i]);
38 }
39 printf("\n");
40 return 0;
41 }