ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1310A - Recommendations(思维+模拟)

2021-03-29 22:02:16  阅读:217  来源: 互联网

标签:num 花费 LL 1310A 累加 cost Recommendations include 模拟


https://codeforces.com/problemset/problem/1310/A


题意:

给定两个 n 长度的数组 a 和 t,可以花费 ti​ 使 ai​ 增大 1,问使 a 数组的所有数字都不同的最小花费。

思路:

感觉碰过挺多类似的?

如果有 2 个相同的数,一定是把花费较小的那个数 +1 ,如果有 3 个相同的数,一定是把花费较小的那 2 个数 +1。对于相同的n个数,对花费较小的n-1个+1。

然而这样维护需要n^2起步。转化一下,每次累加当前的和,找到一个最大的值给他踢出去,和减去这个最大值,然后累加到答案里去。

然后就细节模拟 复杂度2*n*logn

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=2e5+1000;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar();	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
struct P{
  LL num,cost;
}a[maxn];
bool cmp(P A,P B){
    if(A.num==B.num) return A.cost<B.cost;
    return A.num<B.num;
}
int main(void)
{
  	cin.tie(0);std::ios::sync_with_stdio(false);
    LL n;cin>>n;
    for(LL i=1;i<=n;i++)  cin>>a[i].num;
    for(LL i=1;i<=n;i++)  cin>>a[i].cost;
    sort(a+1,a+1+n,cmp);
    priority_queue<LL>que;
    que.push(a[1].cost);
    LL cur=a[1].num;///当前堆内的统一数字编号
    LL ans=0;
    LL sum=a[1].cost;
    for(LL i=2;i<=n;i++){
        if(cur!=a[i].num){
            if(que.size()==1){
                que.pop();
                cur=a[i].num;
                que.push(a[i].cost);
                sum=0;
                sum+=a[i].cost;
            }
            else{
                while(cur<a[i].num&&!que.empty()){
                    LL topcost=que.top();que.pop();
                    sum-=topcost;
                    ans+=sum;
                    cur++;
                }
                if(que.empty()) cur=a[i].num;
                que.push(a[i].cost);
                sum+=a[i].cost;
            }
        }
        else if(cur==a[i].num){
            sum+=a[i].cost;
            que.push(a[i].cost);
        }
    }
    while(!que.empty()){
        LL topcost=que.top();que.pop();
        sum-=topcost;
        ans+=sum;
    }
    cout<<ans<<"\n";
return 0;
}

 

标签:num,花费,LL,1310A,累加,cost,Recommendations,include,模拟
来源: https://blog.csdn.net/zstuyyyyccccbbbb/article/details/115312218

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有