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