5771: 小明的账单 multiset

发布时间 2023-10-13 18:26:55作者: CRt0729

描述

 

 

小明在一次聚会中,不慎遗失了自己的钱包,在接下来的日子,面对小明的将是一系列的补卡手续和堆积的账单… 在小明的百般恳求下,老板最终同意延缓账单的支付时间。可老板又提出,必须从目前还没有支付的所有账单中选出面额最大和最小的两张,并把他们付清。还没有支付的账单会被保留到下一天。 请你帮他计算出支付的顺序。

 

 

输入

 

 

第1行:一个正整数N(N≤15,000),表示小明补办银联卡总共的天数。

第2行到第N+1 行:每一行描述一天中收到的帐单。先是一个非负整数M≤100,表示当天收到的账单数,后跟M个正整数(都小于1,000,000,000),表示每张帐单的面额。

输入数据保证每天都可以支付两张帐单。

 

 

输出

 

 

输出共N 行,每行两个用空格分隔的整数,分别表示当天支付的面额最小和最大的支票的面额。

 

 

样例输入

 

4
3 3 6 5
2 8 2
3 7 1 7
0

样例输出

 

3 6
2 8
1 7
5 7

在C++中,std::multiset是一个容器,它存储排序的元素。std::multiset::begin()和std::multiset::end()函数返回的是迭代器,而不是元素本身。迭代器可以被看作是指向容器中元素的指针。

- *st.begin():st.begin()返回一个指向multiset中第一个元素(即最小元素)的迭代器。*操作符用于获取迭代器指向的元素的值,所以*st.begin()表示的是multiset中的最小元素。

- *(--st.end()):st.end()返回一个指向multiset中最后一个元素之后的位置的迭代器,而不是最后一个元素。因此,我们需要使用--操作符将迭代器向前移动一位,使其指向最后一个元素(即最大元素)。然后,我们使用*操作符获取该元素的值。

cout<<*st.begin()<<" ";//输出最小元素
st.erase(st.begin());//删除set中最小元素
cout<<*(--st.end())<<endl;//输出最大元素
st.erase(--st.end());//删除set中最大元素

正确代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3+10,inf = 0x3f3f3f3f;

int main()
{
    multiset<int> s;
    int n;
    cin >> n;
    while(n--)
    {
        int m; cin >> m;
        while(m--)
        {
            int x; cin >> x;
            s.insert(x);
        }
        cout << *s.begin() << " " << *(--s.end()) << endl;
        s.erase(s.begin());
        s.erase(--s.end());
    }
    return 0;
}