其他分享
首页 > 其他分享> > 1310A - Recommendations(思维+模拟)

1310A - Recommendations(思维+模拟)

作者:互联网

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