最小价格 (爱思创算法四)(期中测试)(答案记录)

前言:

这篇文章还是是为了帮助一些

像我这样的菜鸟

找到简单的题解

题目描述

小思老师和小爱老师经常会结伴一起去超市购物,

一天她们分别买了东西放在2个购物车(分别记为A车、B车)里,

A、B里都有n件商品。

这时她们突然想到,

从A,B中可以分别挑出任意一件商品,

并将价格相加,

这样总共得到n*n个和。

她们想知道这些和中最小的n个分别是多少。

输入描述

第一行,一个整数n (1<=n<=50000)

接下来2行,每行都有n个正整数,

用空格隔开,

每个正整数最大值不会超过10^9 。

输出描述

n行,每行一个数字,表示从小到大最小的n个和

输入样例#1

4
1 3 5 7
2 4 6 8

输出样例#1

3
5
5
7

提示

本题线下文件测评时的说明:

- 可执行文件名:price

- 提交源程序文件名:price.cpp

- 输入文件名:price.in

- 输出文件名:price.out

- 时间限制:1秒

- 空间限制:256MB

完整代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
int a[N],b[N];
int cnt[N];
int n;
struct node
{
	int id,val;
	friend bool operator < (node a,node b)
    {
		return a.val>b.val; 
	}
};
priority_queue<node> q;
 
int main()
{
	
	//freopen("price.in","r",stdin);
	//freopen("price.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	sort(a+1,a+n+1);
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++)
    {
		cnt[i]=1;
		q.push(node{i,a[i]+b[1]});
	}	
	for(int i=1;i<=n;i++)
    {
		node cur=q.top();
		q.pop();
		cout<<cur.val<<'\n';
		cnt[cur.id]++;
		cur.val=a[cur.id]+b[cnt[cur.id]];
		q.push(cur);
	}
	return 0;
}

AC

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值