E. MEX and Increments

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
##题意 大概就是求对于给定的n个数的数组,求对于0-n每一个数在数组中使得当前数据是最小的正整数。每次操作让某个数加一
比如对于第一个测试样例 0 1 3
要让0 1 2 3 分别是该数组未出现的最小正整数,
对于不同的数分别求出对应最小操作次数。
对于0 让0变成1,操作一次
对于1 让1变成2 操作一次
对于2 本来就缺少2 不需要操作
对于3 无法操作

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int T,n,m,a[N],b[N];;
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>n;
        for(int i=1;i<=n;i++) a[i] = -1;
        for(int i=1;i<=n;i++) cin >> b[i];
        sort(b + 1, b + 1 + n);
        int sum = 0;
        map<int,int > mp;
        priority_queue<int > q;
        for(int i=1;i<=n;i++) mp[b[i]]++;
        for(int i=0;i<=n;i++)
        {
            a[i] = sum + mp[i];
            if(mp[i])
            {
                while((mp[i]--)>1)
                {
                    q.push(i);
                }
            }
            else
            {
                if(q.size()==0) break;
                sum += i-q.top();
                q.pop();
            }
        }
        for(int i=0;i<=n;i++) cout << a[i] << " ";
        cout<<endl;
    }
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
const int N=2e7+5;
typedef long long ll;
int a[N];
typedef pair<int,int>PII;
int main()
{
int t;cin>>t;
while(t–)
{
int n;cin>>n;
map<ll,ll>mp;
for(int i=0;i<n;i++) cin>>a[i],mp[a[i]]++;
ll sum=0,ch=0;
if(!mp[0]) {
cout<<"0 “;
for(int i=1;i<=n;i++) cout<<”-1 “;
cout<<endl;
continue;
}
int flag=1;
cout<<mp[0]<<” “;
mp[0]–;
priority_queue q;
if(mp[0]!=0) q.push({0,mp[0]});
for(int i=1;i<=n;i++)
{
if(flag==0) cout<<”-1 “;
else if(mp[i]==0)
{
cout<<ch<<’ ';
if(q.size()!=0)
{
auto t = q.top() ;
q.pop();
ll x=t.first,y=t.second;
ch+=i-x;
y–;
if(y!=0) q.push({x,y});
}
else flag=0;
}
else
{
cout<<ch+mp[i]<<” ";
mp[i]–;
if(mp[i]) q.push({i,mp[i] } );
}
}
cout<<endl;
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值