coderforce 569B Inventory

来源:互联网 发布:舟山通达网络 编辑:程序博客网 时间:2024/06/05 08:56

题意:给你一个数列,要求改变最小次数,使改变后的数列为1-n的一个排列

解:标记出现过的&&第一次出现的&&a[i]<=n.其他的,从没出现过的书中,从小到大给其赋值。

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxm=1e5+10;int a[maxm];int b[maxm];int vis[maxm];int vit[maxm];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        memset(vis,0,sizeof(vis));        memset(vit,0,sizeof(vit));        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);            if(!vis[a[i]]&&a[i]<=n)            {                vis[a[i]]=1;            }            else            {                vit[i]=1;            }        }        int cnt=0;        for(int i=1;i<=n;i++)        {            if(!vis[i])            {                b[cnt++]=i;            }        }        cnt=0;        for(int i=0;i<n;i++)        {            if(vis[a[i]]&&!vit[i])            {                printf("%d ",a[i]);            }            else            {                printf("%d ",b[cnt++]);            }        }        printf("\n");    }    return 0;}

0 0
原创粉丝点击