#Z3017. 使用 multiset 基础

使用 multiset 基础

#include <iostream>

using namespace std;
int main() {
  

    return 0;

}

珠宝店里有 n 颗珍珠,每颗珍珠的品质是 aia_i。现在依次来了 m 位顾客,每个顾客想要买品质不低于 x 的珍珠。珠宝店老板会在满足顾客要求的情况下,卖出品质最差的珍珠。现在请你写一个程序帮忙计算卖给每个顾客的珍珠的品质,如果没有符合要求的输出 -1。 分析 这里我们用一个多重集合multiset来维护所有珍珠的品质,如果用普通集合set,相同品质的珍珠只能在集合中存在一个,逻辑上肯定就不对了。每次找不低于 xx 的最小品质,也就是调用lower_bound来查找。如果得到的迭代器是尾后迭代器,就说明没有找到,输出 −1。否则,输出这个品质并从multiset里删除。

  1. 引入需要的头文件set,在代码开头引入头文件<set>

  2. 定义两个变量 n 和 m,表示珍珠的数量和顾客人数并读入。

    然后定义我们要用到的multiset,名字叫se。 在main函数开头写下:

int n, m;
cin >> n >> m;
multiset<int> se;
  1. 循环读入 n 颗珍珠的品质并插入到多重集合se里。 在main函数里继续写下
for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    se.insert(x);
}
  1. 这一步,我们用while循环来处理 m 个顾客的情况,每次读入一个整数 x,表示顾客的需求是品质不低于 x 的珍珠。然后在多重集合se中调用lower_bound函数得到迭代器it。 在main函数里继续写下
while (m--) {
    int x;
    cin >> x;
    multiset<int>::iterator it = se.lower_bound(x);
}
  1. 这时候,我们需要判断迭代器it是否为尾后迭代器。如果是,就表示不存在符合要求的珍珠,输出 -1。否则,输出这个品质并从se里删除。 在while循环里继续写下
if (it == se.end()) {
    cout << -1 << endl;
} else {
    cout << *it << endl;
    se.erase(it);
}
  1. 点击 运行,输入下面数据查看结果。
8 6
10 6 3 4 8 8 4 2
5 7 7 7 10 1