信息学奥赛一本通:小明的账单

【题目描述】

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

【输入】

第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

【思路】

这题是老师布置的作业,我不会做

然后听老师讲的思路。。。

方法一:使用两个堆

        有亿点点复杂……

        所以我没写

        

        pass。。。

方法二:使用STL中的multiset

       关于multiset的用法

        multiset可以自动排序并且不会自动去重

        所以我们只需要把每次读入的x录入我们定义的multiset当中就可以了。

【代码】

#include<bits/stdc++.h>
using namespace std;
multiset<int> mu;
int main(){
	int n;
	cin>>n;
	while(1){
		int m;
		cin>>m;
		for(int i=1;i<=m;i++){
			int x;
			cin>>x;
			mu.insert(x);
		}
		cout<<*mu.begin()<<" ";
		cout<<*mu.rbegin()<<"\n";
		mu.erase(mu.begin());
		mu.erase(--mu.end());
		if(m==0)
			return 0;
	}
	return 0;
}

哈哈,没错,你想的很对,这是错误代码

呵,没事没事,失败是成功之母

结果,经过我一次又一次的“尝逝”(尝逝=>尝试逝世)后,我逝了……

还是去问老师吧……

然后

呃呃

问题居然出在了输入上!!!

想彪国粹……

好吧,在我n次的修改后,这个代码诞生了——

#include<bits/stdc++.h>
using namespace std;
multiset<int> mu;
int main(){
	int n;
	cin>>n;
	int m;
	while(n--){
		cin>>m;
		for(int i=1;i<=m;i++){
			int x;
			cin>>x;
			mu.insert(x);
		}
		int x=(*mu.begin()),y=*(mu.rbegin());
		cout<<x<<" "<<y<<"\n";
		mu.erase(mu.begin());
		mu.erase((--mu.end()));
	}
	return 0;
}

在我满怀希望地把这段代码交上去之后

想彪国粹+1

嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷!!!

在我发现时,又双叒想到了把cin改成scanf。。。

代码生成ing。。。

#include<bits/stdc++.h>
using namespace std;
multiset<int> mu;
int main(){
	int n;
	scanf("%d",&n);
	int m;
	while(n--){
		cin>>m;
		for(int i=1;i<=m;i++){
			int x;
			scanf("%d",&x);
			mu.insert(x);
		}
		int x=(*mu.begin()),y=(*mu.rbegin());
		printf("%d %d\n",x,y);
		mu.erase(mu.begin());
		mu.erase((--mu.end()));
	}
	return 0;
}

在我把代码提交上去之后……

哇哇哇哇!!!

AC了!!!!

真是老天不负有心人呀!

哈哈哈哈哈哈!!!!!

(开心屎我了)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值