您的位置:首页 > 其它

codeforces 569B - Inventory

2015-08-11 10:30 393 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: