南沙C++信奧老師解一本通題:1372:小明的賬單

南沙区信奥赛陈老师發表於2024-09-22

【題目描述】

小明在一次聚會中,不慎遺失了自己的錢包,在接下來的日子,面對小明的將是一系列的補卡手續和堆積的賬單… 在小明的百般懇求下,老闆最終同意延緩賬單的支付時間。可老闆又提出,必須從目前還沒有支付的所有賬單中選出面額最大和最小的兩張,並把他們付清。還沒有支付的賬單會被保留到下一天。 請你幫他計算出支付的順序。

【輸入】

第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

#include <bits/stdc++.h>
using namespace std;
struct Node {
    int id;
    int money;
};
bool v[1500001];// 標誌是否支付 
struct cmpsmall//小頂堆比較仿函式 
{
	bool operator () (Node a, Node b)
	{
		return a.money > b.money;
	}
};
struct cmpbig//大頂堆比較仿函式 
{
	bool operator () (Node a, Node b)
	{
		return a.money < b.money;
	}
}; 
int main()
{
	priority_queue<Node, vector<Node>, cmpsmall> pqmin;//小頂堆
	priority_queue<Node, vector<Node>, cmpbig> pqmax;//大頂堆
	int n,num,id=0,bill;//賬單 
	cin>>n;
	while(n--)
	{
		cin>>num;
		for(int i=1;i<=num;i++)
		{
			cin>>bill;
			id++;
			Node node1={id,bill};
			Node node2={id,bill};
			pqmin.push(node1);		
			pqmax.push(node2);		
		}
		while( v[pqmin.top().id ]==true)	
			pqmin.pop();
		cout<< pqmin.top().money <<" ";
		v[  pqmin.top().id ]=true;
		pqmin.pop();
		
		while( v[pqmax.top().id ]==true)	
			pqmax.pop();
		cout<< pqmax.top().money <<endl;
		v[  pqmax.top().id ]=true;
		pqmax.pop();
		
	}
	return 0;
}
南沙C++信奧老師解一本通題:1372:小明的賬單

相關文章