【数据结构 | C++】小明的账单

小明的账单

在这里插入图片描述

背景
Special for beginners

描述
小明在一次聚会中,不慎遗失了自己的钱包,在接下来的日子,面对小明的将是一系列的补卡手续和堆积的账单。

在小明的百般恳求下,老板最终同意延缓账单的支付时间。可老板又提出,必须从目前还没有支付的所有账单中选出面额最大和最小的两张,并把他们付清。还没有支付的账单会被保留到下一天。

请你帮他计算出支付的顺序。

输入格式:
第 1 行:一个正整数 N(N≤15,000),表示小明补办银联卡总共的天数。
第 2 行到第 N+1 行:每一行描述一天中收到的帐单。先是一个非负整数 M≤100,表示当天收到的账单数,后跟 M 个正整数(都小于 1,000,000,000),表示每张帐单的面额。
输入数据保证每天都可以支付两张帐单。

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

样例输入1
4
3 3 6 5
2 8 2
3 7 1 7
0

样例输出1
3 6
2 8
1 7
5 7

#include<bits/stdc++.h>
using namespace std;
int n,m;
int id=0;
bool vis[3000005];//账单是否已还清
struct node {//账单
    int id;//账单编号
    int num;//账单金额
};
struct big{//大根堆比较仿函数
    bool operator() (const node x,const node y){
        return x.num<y.num;
    }
};
struct samll{//小根堆比较仿函数
    bool operator() (const node x,const node y){
        return x.num>y.num;
    }
};
priority_queue <node,vector<node>,big> qd;//大根堆
priority_queue <node,vector<node>,samll> qx;//小根堆
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for (int i=1;i<=n;i++){//n天
        cin>>m;
        for(int i=1;i<=m;i++){//每天m个账单
            int x;
            cin>>x;
            id++;//编号
            node t;
            t.id=id;
            t.num=x;
            qd.push(t);
            qx.push(t);
        }
        while(vis[qx.top().id]==true){
            qx.pop();
        }
        while(vis[qd.top().id]==true){
            qd.pop();
        }
        cout<<qx.top().num<<" "<<qd.top().num<<"\n";
        vis[qx.top().id]=true;
        vis[qd.top().id]=true;
    }
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值