STL——set

来源:互联网 发布:淘宝联盟网页版怎么用 编辑:程序博客网 时间:2024/05/29 04:37

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;//声明multisetmultiset<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);        }    }}
原创粉丝点击