题目描述:

知识点:

lower_bound和uper_bound

lower_bound(起始地址,结束地址,要查找的数值) 返回的是数值 第一个 出现的位置。

upper_bound(起始地址,结束地址,要查找的数值) 返回的是数值 最后一个 出现的位置。

binary_search(起始地址,结束地址,要查找的数值)  返回的是是否存在这么一个数,是一个bool值

lower_bound(val):返回容器中第一个值【大于或等于】val的元素的iterator位置。

upper_bound(val): 返回容器中第一个值【大于】val的元素的iterator位置

使用:

int low=lower_bound(t.begin(),t.end(),)-t.begin(); int upp=upper_bound(t.begin(),t.end(),)-t.begin();

思路:

题目是说要让数组a的每一位与b中某一位相加取余后最小,找规律可得

a              对应b的“最好选择元素”的优先级为

0              0  1  2  ...  n-1

1   n-1  0  1  ...  n-2  

2        n-2  n-1  0  ...  n-3 

...

n-1     1  2  3  ...  0

刚开始做法是真的列了一个大数组从0到200000,读入b的时候就直接把数字存到index对应的位置,如b[n]=n,然后根据不同的a[i]遍历整个b数组,结果超时

第二次把不用b那么大的数组,b中只存b[i],对b排序,对每个a[i]遍历b数组,因为b中对应a[i]最优先的数应为n-a[i]。在b中查找,如果找到,数字用掉并标记为-1;若没找到,按算法应返回的是不超过b的最后一个元素,此时将位置+1即可选取到次优先的a[i]对应的数,当然要选择大于等于0的数,即为使用的。结果超时

第三次不用标记-1,改用listr直接remove,想着是删除元素list应该比vector要快一点,结果超时

第四次想到既然排好序了,二分吧,刚好可以用lower_bound符合语义。结果超时

最后上网搜题解,用multiset的lower_bound,要更快。。。好像set的内部实现是平衡二叉树,所以更快?

不过最后提醒了我,既然排好序了,就该想到二分来提速(O(log n)),而不是傻傻的遍历一遍又一遍(O(n)).

下面是代码:

 #include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#define max_n 200005
using namespace std;
int n;
vector<int> a;
multiset<int> b; int main()
{
cin >> n;
int nums;
for(int i = ;i<n;i++)
{
cin >> nums;
a.push_back(nums);
}
for(int i = ;i<n;i++)
{
cin >> nums;
b.insert(nums);
}
for(auto i = a.begin();i!=a.end();i++)
{
int num = n-*i;
//cout << "num " << num << endl;
set<int>::iterator j;
//for(j = b.begin();*j<num&&j!=b.end();j++);
j = b.lower_bound(num);
if(j!=b.end()&&(*j==num||*j>num))
{
*i = (*i+*j)%n;
}
else if(j==b.end())
{
j=b.begin();
*i=(*i+*j)%n;
}
//cout << "b " << b[j] << endl;
b.erase(j);
}
for(auto i = a.begin();i!=a.end();i++)
{
cout << *i << " ";
}
return ;
}

C.Minimum Array(二分+set)的更多相关文章

  1. 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}$中任取一个数 ...

  2. Leetcode 153. Find Minimum in Rotated Sorted Array -- 二分查找的变种

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  3. 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\ ...

  4. 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] ...

  5. 33. Search in Rotated Sorted Array(二分查找)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  6. hdu 5587 Array 二分

    Array Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem ...

  7. 34. Find First and Last Position of Element in Sorted Array + 二分

    题意懒得抄了,大概是:在升序数组中给定整数target,找到第一个和最后一个target的索引,找到返回{index1, index2},否则返回{-1, -1}: 时间复杂度要求:O(logn) 分 ...

  8. Leetcode | Find Minimum in Rotated Sorted Array I && II

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  9. Search in Sorted Array,Search in Rotated Sorted Array,Search in Rotated Sorted ArrayII

    一:Search in Sorted Array 二分查找,可有重复元素,返回target所在的位置,只需返回其中一个位置,代码中的查找范围为[low,high),左闭右开,否则容易照成死循环. 代码 ...

随机推荐

  1. 关于SET QUOTED_IDENTIFIER {ON|OFF}的问题

    SQL SERVER的联机丛书的解释:“当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔.当 SET QUOTED_IDENTIFIER 为 ...

  2. C# Task 暂停与取消 或 C#中可取消的Task

    (1)https://www.cnblogs.com/zhengzc/p/10724839.html (2)https://blog.csdn.net/hxfhq1314/article/detail ...

  3. ETF参数:现金替代标志

    表示该股票是否允许用现金进行替代. 0表示沪市股票禁止现金替代(必须有股票) 1表示沪市股票可以进行现金替代(先用股票,股票不足的话用现金替代) 2表示沪市股票必须用现金替代. 对于跨市场ETF,3表 ...

  4. django缓存相关

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39726347/articl ...

  5. Appium 环境配置(sdk)

    1,jdk环境配置 参见jdk环境配置:https://www.cnblogs.com/changpuyi/p/8659545.html 2,sdk环境的配置 前提已经下载,解压adt-bundle- ...

  6. js中对字符串操作的常见方法(1)

    String类型 创建一个String类型的实例 var stringObject = new String("hello world"); String类型的属性 length; ...

  7. C语言指针的一些用法

    指针是C语言的灵魂,精华之所在.指针强大而危险,用得好是一大利器,用得不好是一大潜在危害.正是指针具有强大而又危险的特性,加上指针比较难,很多人用的不好,所以越是封装程度高的语言,越是没有指针的&qu ...

  8. *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS

    Warning提示的原因是 一些未使用的函数被编译进入芯片,浪费了RAM/ROM. 解决的方法: 1.将不用的函数注释: 2.在未使用函数的首尾加条件编译 #ifdef 函数名 和 #endif ,不 ...

  9. Shell编程入门基础上

    前言 为什么学 Shell Shell 脚本语言是实现 Linux/UNIX 系统管理及自动化运维所必备的重要工具, Linux/UNIX 系统的底层及基础应用软件的核心大都涉及 Shell 脚本的内 ...

  10. Java线程本地存储ThreadLocal

    前言 ThreadLocal 是一种 无同步 的线程安全实现 体现了 Thread-Specific Storage 模式:即使只有一个入口,内部也会为每个线程分配特有的存储空间,线程间 没有共享资源 ...