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