codeforces 864D

来源:互联网 发布:淘宝双十一c店报名条件 编辑:程序博客网 时间:2024/06/07 05:07

http://codeforces.com/problemset/problem/864/D





将一串数列进行换数字操作,问最少需要多少次操作可以将整个数列换成自然数的全排列,并且输出从头比较较小情况下的数列。先找出哪些数字出现过超过1次,表示可以换掉,然后去跑哪些数字没有出现过,去与可以被换掉的数字换,如果被换的较大则直接换掉就可以了,如果被换的较小,则将该数字与被换的数字的第二次出现的位置进行变换。



#include<bits/stdc++.h>using namespace std;int num[222222];int vis[222222];int vs[222222];int  ans[222222];int main(){int n;while(cin>>n){    int i,j,k;    memset(vis,0,sizeof(vis));    memset(ans,0,sizeof(ans));    for(i=0;i<n;i++)    {    scanf("%d",&num[i]);    vis[num[i]]++;}int tim=0;for(i=1;i<=n;i++){if(vis[i]==0){vs[tim]=i;tim++;}else vis[i]--;}int js=0;vs[tim]=999999;    for(i=0;i<n;i++)    {    if(num[i]>vs[js]||ans[num[i]])    {    if(vis[num[i]]>=1)   {    vis[num[i]]--;    num[i]=vs[js];    js++;    }}    else ans[num[i]]=1;}int q=0;cout<<tim<<endl;for(i=0;i<n;i++){if(q++)cout<<" ";cout<<num[i];}cout<<endl;}return 0;}


原创粉丝点击