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 }

猜你喜欢

转载自www.cnblogs.com/letlifestop/p/10924177.html