set/multiset:
set每个数都是唯一的,默认按照从小到大排序
multiset每个数可以多个存在,也是从小到大排序
set<容器适配器> name;
set:: iterator it; 声明一个适用于int类型set的迭代器,变量名it
set::reverse_iterator rit; 声明一个反向迭代器
insert( 数) 将这个数插入
insert(指针first,指针last) 将这个区间内的数插入
insert (指针,数) 将数插入指定位置
erase(数) 将这个数删除,如果是multiset则所有这个数都删掉
erase(指针) 将这个位置的数删除
erase(指针first,指针last) 将这个区间内的数删除
lower_bound / upper_bound(指针first,指针last,数) 二分查找第一个大于等于/严格大于 指定数的数,返回一个指向这个位置的指针。若找不到返回end()
bigin() 第一个
end() 尾指针,最后一个的后面一个
rbegin() 倒数第一个
rend() 倒数的尾指针,第一个的前面一个
——前缀r 的都是反向迭代器,要用reverse_iterator
酒店
Time Limit: 1000MS Memory Limit: 1000K
Description
商店有n瓶酒,每瓶酒有一个度数xi,
有Q个人来买酒,要度数为v的酒,若店里没有度数为v的酒,
店主就会拿出度数高一点的酒(度数为t且t>v)卖给客人,
但有一个要求,t需要满足t-v<=Y;每输入一个客人要的酒的度数,
就输出店主卖出酒的度数,若店主没能卖出酒,就输出-1;
Input
第一行是一个T,表示样例的个数
对于每一个样例;
第一行是三个数字, N,Q and Y.
第二行有N个数字, 表示每一瓶酒的度数.
第三行有Q个数字, 表示从早上到晚上顾客要的酒的度数.
这里所有的数字在0和1,000,000之间
Output
对于每一个样例, 输出 “Case I:”, I表示样例的序号, 下面有Q行数字,
表示店主卖出酒的度数. 如果店家卖不出这样的酒,输出-1.
Sample Input
2
2 3 3
2 3
1 2 3
2 3 0
2 3
3 1 2
Sample Output
Case 1:
2
3
-1
Case 2:
3
-1
2
#include<iostream>
#include<stdio.h>
#include<set>
using namespace std;
multiset<int>s;//声明multiset
multiset<int>::iterator it;//声明一个迭代器
int main()
{
int T;
cin >> T;
for (int I = 0; I < T; I++)
{
s.clear();
printf("Case %d:\n", I + 1);
int n, q, y;
scanf("%d%d%d", &n, &q, &y);
int t;
for (int i = 0; i < n; i++)
{
scanf("%d", &t);
s.insert(t);
}
cout << *s.rend();
while (q--)
{
scanf("%d", &t);
it = s.lower_bound(t);
if (it == s.end()||*it-t>y)//若没有比这个数大的返回s.end()
{
cout << "-1" << endl;
continue;
}
printf("%d\n", *it);
s.erase(it);
}
}
}