Inventory
题目链接:
http://codeforces.com/contest/569/problem/B
解题思路:
Let's look at the problem from another side: how many numbers can we leave unchanged to get permutation? It is obvious: these numbers must be from 1 to n and they are must be pairwise distinct. This condition is necessary and sufficient.
This problem can be solved with greedy algorithm. If me meet the number we have never met before and this number is between 1 and n, we will leave this number unchanged. To implement this we can use array where we will mark used numbers.
After that we will look over the array again and allocate numbers that weren't used.
Complexity — O(n).
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int n;
int a[100005];
int vis[100005];
int main(){
while(~scanf("%d",&n)){
memset(vis,0,sizeof(vis));
queue<int> q;
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
if(!vis[a[i]] && a[i] <= n)
vis[a[i]] = 1;
else
q.push(i);
}
int tmp;
for(int i = 1; i <= n; i++){
if(!vis[i]){
tmp = q.front();
q.pop();
a[tmp] = i;
}
}
for(int i = 1; i < n; i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
return 0;
}
本文介绍了一个CodeForces竞赛中B级难度题目的解题思路及实现代码。该问题可通过贪心算法解决,关键在于从1到n的数字必须出现且唯一。使用数组标记已使用的数字,并为未使用的数字分配位置。
94

被折叠的 条评论
为什么被折叠?



