codeforces 569B - Inventory

来源:互联网 发布:淘宝自动打款时间 编辑:程序博客网 时间:2024/06/05 10:32

题目链接:Click here

题意:给你t个数,合法的数为只出现在1~t之间,没有重复出现的数。要求你将不合法的数该为合法的数。

思路:将给的数中出现的数标记起来,重复或出界的数存到另一个数组中,在从1~t循环查找未标记的数,将不合法的数改为该数。

#include <iostream>#include <cstring>#include <cstdio>#include <queue>#include <cstdlib>using namespace std;int a[100005];int b[100005];int f[100005];int main(){    int t, x;    while(scanf("%d", &t)!= EOF)    {        x = 1;        memset(f, 0, sizeof(f));        for(int i = 1; i <= t; i++)        {            scanf("%d", &a[i]);            if(f[a[i]] == 0 && a[i] <= t)                f[a[i]] = 1;            else            {                b[x] = i;                x++;            }        }        x--;        for(int i = t; i > 0; i--)        {            if(f[i] == 0)            {                a[b[x]] = i;                x--;            }        }        for(int i = 1; i < t; i++)            printf("%d ", a[i]);        printf("%d\n", a[t]);    }    return 0;}
0 0
原创粉丝点击