注册 登录
编程论坛 C++教室

谁能帮我看看这道题?要简单一点的答案哦

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

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

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

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

输出
  输出共N 行,每行两个用空格分隔的整数,分别表示当天支付的面额最小和最大的支票的面额。
3 回复
#2
Jonny02012018-11-18 16:22
对输入的数据进行排序 (std::sort)
每天取最前面和最后面
对于最大金额和最小金额的具体信息和支付顺序, 可以用 map<int /* 顺序 */, double /* 金额 */> 表示
#3
rohalloway2018-11-18 18:08
程序代码:

#include <iostream>
#include <set>

using namespace std;

//STL的multiset容器会自动排序其中的元素
multiset<int> ms;

void coutValue()
{
    //打印multiset容器第一个和最后一个元素,
   
//因为multiset容器自动排序的,所以*--ms.end()是最大值,*ms.begin()是最小值
   
//end()指向容器最后一个元素的下一个内存地址,所以这里要自减,让迭代器指向容器的最后一个元素
    cout << *ms.begin() << " " << *--ms.end() << endl;

    //删除已经打印过的最大值和最小值
    ms.erase(ms.begin());
    ms.erase(--ms.end());
}

int main() {
    int n = 0;

    //输入n以及限制条件
    while (cin >> n)
    {
        if (n > 0 && n <= 15000) {
            cout << "输入第2行到第N+1 行:" << endl;
            break;
        }
        else
            cout << "重新输入(0<N≤15,000)" << endl;
    }

    int m = 0,val = 0;

    //输入m以及限制条件
    while (cin >> m)  
    {
        if (m > 0 && m <= 100) {
            cout << "输入第2行到第N+1 行:" << endl;
            break;
        }
        else
            cout << "重新输入(0<M≤100)" << endl;
    }

    while (cin >> val)
    {
        ms.insert(val);

        if (ms.size() == m)
            break;
    }

    //输出,数据成对儿输出的,所以要除2
    for(int i =0; i<m/2; i++)
        coutValue();

    system("pause");
    return 0;
}



使用STL写的,希望能帮到你

参考这里
https://zh.

[此贴子已经被作者于2018-11-18 18:11编辑过]

#4
rjsp2018-11-19 10:10
连题目都不肯贴全呀?
http://www.
1