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的第一个元素位置
#includeusing 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月11日 04时03分42秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
基于java的学生管理系统
2019-04-29
基于java网盘搜索的设计与实现
2019-04-29
基于SSM的仿小米商城源码
2019-04-29
基于SSM的医院人事管理系统的设计与实现
2019-04-29
基于SSM的网上购物系统的设计与开发
2019-04-29
基于SSM框架的BS微博系统的设计与实现
2019-04-29
超市订单管理系统
2019-04-29
基于ssm的民宿网站
2019-04-29
基于JavaWeb的物流管理系统的设计与实现
2019-04-29
基于Java的飞机大战游戏的设计与实现论文
2019-04-29
基于java实现的超级马里奥游戏
2019-04-29
keepalived 实现高可用,负载均衡
2019-04-29
linux发送邮件通知
2019-04-29
linux不删除文件:替换rm命令
2019-04-29
Centos6 搭建lnmp环境
2019-04-29
Hbase优化:使用压缩snappy,lz4
2019-04-29
maven 安装第三方jar包到本地仓库
2019-04-29
hbase数据结构模型
2019-04-29
Shell编程:return 返回脚本调用的状态码
2019-04-29
Hbase Shell 调用java代码:通过比较器,强过滤查询
2019-04-29