Codeforces Round #555 (Div. 3), problem: (E) Minimum Array【贪心+二分 lower_bound+multiset初见】
发布日期:2021-06-29 14:25:50 浏览次数:3 分类:技术文章

本文共 937 字,大约阅读时间需要 3 分钟。


题目大意

给你两个长度为n的数组,记为a和b,然后我们可以对b数组进行排序,来获得一个新的数组c,c数组通过(ai+bj)%n求得,最后我们要使得c数组的字典序最小


题解

暴力o(n ^ 2 )会超时。

由题意,要使得数组c的字典序最小,很明显是个贪心的题,即我们每次ab数组相加后取余得到的值每次要最小,即ai+bi大于n并且最接近n,如果相加不能大于或者等于n的话,那么我们就用最小的数

multiset这个容器就能很好的维护b数组,首先内置红黑树,能动态的从小到大排序,与set不同的是,multiset不会去重,所以能维护一下

如何找到bi使得ai+bi大于n并且最接近n呢,我们可以用二分相关的lower_bound函数来查找,lower_bound(int x)函数会返回大于或等于x的第一个元素位置

另外,也学习一下upper_bound(int x) 函数会返回大于x的第一个元素位置

#include
using namespace std;int n;const int maxn=2e5+10;int a[maxn];multiset
mu;int main(){
ios::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++){
int x; cin>>x; mu.insert(x); } multiset
::iterator it; for(int i=1;i<=n;i++){
it=mu.lower_bound(n-a[i]); if(it==mu.end()) it=mu.begin(); cout<<(*it+a[i])%n<<" "; mu.erase(it); } return 0;}
学如逆水行舟,不进则退

转载地址:https://chocolate.blog.csdn.net/article/details/101629519 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Codeforces Round #555 (Div. 3), problem: (C1) Increasing Subsequence (easy version) 【贪心】
下一篇:2019 ACM训练计划——( 每天5题 ) 训练计划 11

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月11日 04时03分42秒