Codeforces Round #555 (Div. 3) E. Minimum Array (贪心,二分,set)

题意:给你两个长度为\(n\)的数组\(a\)和\(b\),元素值在\([0,n-1]\),可以对\(b\)数组的元素任意排序,求新数组\(c\),满足\(c_i=(a_i+b_i)\ mod\ n\),并且使得其字典序最小.
题解:这种取模求最小的题,我们一眼就能看出最优情况一定是\(b_i=n-a_i\),可以先用set存一下\(b\)中的元素,然后在set中二分找\(\ge \ n-a_i\)的值,因为\(a_i\)加上一个比\(n-a_i\)小的数再取模一定\(\ge a_i\),但是加上\([n-a_i,n-1]\)中的数一定再取模的范围在\([0,a_i-1]\),因为加上\(n-a_i\)取模的值是\(0\),而\([n-a_i,n-1]\)中有\(a_i\)个数,所以这样贪心一定正确的,假如set没有比\(n-a_i\)大的数,那么我们取集合中的第一个元素一定是最优的.
代码:
int n;
int a[N];
int x;
set<int> s;
map<int,int> mp; int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n; rep(i,1,n) cin>>a[i];
rep(i,1,n){
cin>>x;
mp[x]++;
s.insert(x);
} s.insert(n); rep(i,1,n){
if(a[i]==0) a[i]=n;
auto cur=s.lower_bound(n-a[i]); if(*cur==n){
int now=*s.begin();
cout<<(now+a[i])%n<<' ';
mp[now]--;
if(mp[now]==0) s.erase(now);
continue;
} cout<<(*cur+a[i])%n<<' ';
mp[*cur]--;
if(mp[*cur]==0) s.erase(*cur);
} return 0;
}
Codeforces Round #555 (Div. 3) E. Minimum Array (贪心,二分,set)的更多相关文章
- Codeforces Round #555 (Div. 3) E. Minimum Array 【数据结构 + 贪心】
一 题面 E. Minimum Array 二 分析 注意前提条件:$0 \le a_{i} \lt n$ 并且 $0 \le b_{i} \lt n$.那么,我们可以在$a_{i}$中任取一个数 ...
- Codeforces Round #555 (Div. 3) E. Minimum Array
题意:b数组可以自由排序,c[i]=(a[i]+b[i])%n. 题目中要求c数组的字典序是最小的.那么我们需要尽量满足前面的c[i],才能使字典序最小. 我们知道a[i]和b[i]都是[0,n-1] ...
- Codeforces Round #258 (Div. 2) . Sort the Array 贪心
B. Sort the Array 题目连接: http://codeforces.com/contest/451/problem/B Description Being a programmer, ...
- Codeforces Round #667 (Div. 3) B. Minimum Product (贪心,数学)
题意:给你\(a\)和\(b\)两个数,每次操作可以是任意一个数\(-1\),最多操作\(n\),并且\(a\ge x\),\(b\ge y\),求操作后\(a*b\)的最小值. 题解:观察样例并且在 ...
- Codeforces Round #365 (Div. 2) C - Chris and Road 二分找切点
// Codeforces Round #365 (Div. 2) // C - Chris and Road 二分找切点 // 题意:给你一个凸边行,凸边行有个初始的速度往左走,人有最大速度,可以停 ...
- 老年OIer的Python实践记—— Codeforces Round #555 (Div. 3) solution
对没错下面的代码全部是python 3(除了E的那个multiset) 题目链接:https://codeforces.com/contest/1157 A. Reachable Numbers 按位 ...
- CodeForces Round #555 Div.3
A. Reachable Numbers 代码: #include <bits/stdc++.h> using namespace std; ; int N; set<int> ...
- Codeforces Round #555 (Div. 3)[1157]题解
不得不说这场div3是真的出的好,算得上是从我开始打开始最有趣的一场div3.因为自己的号全都蓝了,然后就把不经常打比赛的dreagonm的号借来打这场,然后...比赛结束rank11(帮dreago ...
- Codeforces Round #555 (Div. 3) c2 d e f
c2:Increasing Subsequence (hard version) 那边小取那边,然后相等比较后面的长度 #include<bits/stdc++.h> using name ...
随机推荐
- awk中的if ,else
local pct="$(awk -v one="$1" -v two="$2" 'BEGIN{ if (two > 0) { printf & ...
- 汇编学习笔记——DOS及DEBUG介绍
转自:https://www.shiyanlou.com/courses/running/332 一.课程简介 声明:该课程基于<汇编语言(第2版)>郑晓薇 编著,机械工业出版社.本节实验 ...
- Linux删除文件后磁盘目录不释放
今天测试oracle数据库的时候,把表空间连带内容和数据文件一并删除了,但是删除之后,查看数据文件不存在了,但是目录的带下没有释放 SQL> drop tablespace users incl ...
- Docker 拉取镜像速度太慢
Docker Hub 是我们分发和获取 Docker 镜像的中心,但由于服务器位于海外,经常会出现拉取/上传镜像时速度太慢或无法访问的情况.再加上运营方不断对 Docker Hub 的免费使用进行限制 ...
- Redis 实战 —— 08. 实现自动补全、分布式锁和计数信号量
自动补全 P109 自动补全在日常业务中随处可见,应该算一种最常见最通用的功能.实际业务场景肯定要包括包含子串的情况,其实这在一定程度上转换成了搜索功能,即包含某个子串的串,且优先展示前缀匹配的串.如 ...
- 解决Linux下mysql区分大小写的问题
1.查看lower_case_table_names的值,0代表区分大小写,1代表不区分大小写. 通过命令:SHOW VARIABLES LIKE 'lower%'; 1. 解决方法 以root用户登 ...
- c++hook内联汇编模板
1 #include "Windows.h" 2 #include "tlhelp32.h" 3 #include "String.h" 4 ...
- 406 UDP协议是面向非连接的协议 Keep-Alive
HTTP The Definitive Guide Table 3-1. Common HTTP methods Method Description Message body? GET ...
- IdentityServer4之Implicit和纯前端好像很配哦
前言 上一篇Resource Owner Password Credentials模式虽然有用户参与,但对于非信任的第三方的来说,使用这种模式是有风险的,所以相对用的不多:这里接着说说implicit ...
- win10自带输入法突然变成了繁体
有可能是在使用Eclipse/MyEclipse的Ctrl + Shift + F进行代码格式化的时候与输入法的热键冲突了