zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    两数之和
    数组,链表,跳表
    第二讲:增长全景图
    三数之和
    第一讲:增长的本质
    移动零
    八十忆双亲+师友杂记
    java:从命令行接收多个数字,求和之后输出结果
    编程的精义读后感
    java语言基础第三讲作业
  • 原文地址:https://www.cnblogs.com/wasa855/p/12402980.html
Copyright © 2011-2022 走看看