YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

https://blog.csdn.net/w_udixixi/article/details/104479288

大意:n个数,每个数只能向上加,a[i]+1需要的时间是t[i],求使这n个数无重复数字的最少时间。

题解:并查集+贪心。怎么用并查集呢?当一个数第一次出现时,将x和x+1连起来,当我们再次访问x时,直接找到的是x+1。贪心是将花费大的点尽量往前放,因为后出现的点肯定是让变化的,让它的花费尽可能的小就好了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2E5+7;
map<ll ,ll >fa;
struct stu{
    ll a,time;
    bool friend operator < (const stu &x,const stu &y){
        return x.time>y.time;
    }
}arr[N];
ll find(ll x){
    if(fa[x]==0) return x;
    else {
        ll c=fa[x];
        return fa[x]=find(c);
    }
}
void unit(ll x,ll y)
{
    ll c = find(x);
    ll c1= find(y);
    if(c!=c1) fa[c]=c1;
}
int main()
{
    ll n;
    cin>>n;fa.clear();
    for(ll i=1;i<=n;i++) cin>>arr[i].a;
    for(ll i=1;i<=n;i++) cin>>arr[i].time;
    sort(arr+1,arr+1+n);
    ll ans=0;
    for(ll i=1;i<=n;i++){
        ll x=find(arr[i].a);
        ans+=(x-arr[i].a)*arr[i].time;
        unit(x,x+1);
    }
    cout<<ans<<endl;
    return 0;
}

 

posted on 2020-03-04 19:48  Target--fly  阅读(165)  评论(0编辑  收藏  举报