买玩具

买玩具

1. 题目要求
★问题描述
三哥非常喜欢收集玩具,现在他有N种不同的玩具。第i种玩具有 ai个,这种玩具的价格为 ti。三哥有很强的强迫症,如果有两种玩具数量相同,三哥就会很不舒服。他准备通过买一些玩具,使得这些玩具中任意两种玩具数量不同。三哥想知道他最少要花多少钱才能让任意两种玩具数量不同。
★数据输入
输入第一行包括一个正整数 N(1<=N<=100000),表示玩具的种类。
第二行输入 N 个正整数 ai(1<= ai<=1000000000),表示第i种玩具的数量。
第三行输入 N 个正整数 ti(1<= ti<=100000),表示第i种玩具的价格。
★数据输出
输出一个整数,为三哥的最少花费,注意这个数可能超过int的范围。
★输入示例1
5
3 7 9 7 8
5 2 5 7 5
★输出示例1
6
★输入示例2
5
1 2 3 4 5
1 1 1 1 1
★输出示例2
0
提示
 示例1中,第2种玩具买3本,会花费6元。  示例2中,所有玩具数量都不相同,所以不用买玩具。  使用print输出long long用%lld格式

2. 代码实现

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll N=100000; 
struct node 
{
	ll a;
	ll t;
} ;
int cmp(node a1, node b)
{
	return (a1.a < b.a);
}
node book[N];
int main()
{
	int n;
	cin>>n;
	for (int i=1;i<=n;i++)
	cin>>book[i].a;
	for (int i=1;i<=n;i++)
	cin>>book[i].t;
	sort(book+1,book+n+1,cmp);
	ll sum=0;
	ll max=book[n].a;
	int i=1;
	while(i<=n)
	{
		int location,count=0;
		for(int j=i+1;j<n;j++)
		{
			if ((book[i].a==book[j].a)&&(i!=n))
			{
				location=i;
				count++;	
			}
			else if(book[i].a!=book[j].a)
			{
				break;
			}
			
		}
		for(int k=location+count-1;k>=location;k--)
		{
			sum+=book[k].t*(max-book[k].a+1);
		}
		if(count !=0)
		{
			max+=count;
		}
		i=i+count+1;	
	}
	cout <<sum<<endl;
	return 0;
}

3. 总结分析

花费最少,要保证便宜的玩具的数量买得多,贵的玩具买得少,基于这个思路在优先队列里面存放相同数量玩具的价格,贵的玩具出队,买便宜的玩具,直到队列为空。
这是一道优先队列与排序算法结合的题目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值