CF1310A Recommendations 题解

感觉这是一道不难的题目。


显然,如果有 2 个相同的数,一定是把花费较小的那个数 +1 ,如果有 3 个相同的数,一定是把花费较小的那 2 个数 +1。

那么可以得出操作的方法,假设目前在处理 (x),那么对于所有满足 (a_i=x)(i) ,把除了 (b_i) 最小的全部 +1,这样可以保证花费最少。

实现的时候不需要什么高级的数据结构(还不会被卡常),每次把要操作的数放进一个堆里,每轮弹掉最大的数即可。

Code:

#define N 200005
struct Node
{
	int x,y;
};
Node a[N];
int n;
bool cmp(Node x,Node y)
{
	return x.x<y.x;
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++) a[i].x=read();
	for(int i=1;i<=n;i++) a[i].y=read();
	sort(a+1,a+n+1,cmp);
	priority_queue<int> q;
	int cur=0,cnt=0,ans=0,tmp=0;
	while(!q.empty()||cur<n)
	{
		cnt++;
		if(q.empty())
		{
			cnt=a[cur+1].x;
			while(cnt==a[cur+1].x&&cur<n)
			{
				cur++;
				tmp+=a[cur].y;
				q.push(a[cur].y);
			}
		}
		else
		{
			while(cnt==a[cur+1].x&&cur<n)
			{
				cur++;
				tmp+=a[cur].y;
				q.push(a[cur].y);
			}
		}
		tmp-=q.top(); q.pop();
		ans+=tmp;
	}
	cout<<ans<<endl;
	return 0;
}
原文地址:https://www.cnblogs.com/wasa855/p/12402980.html