Codeforces 569B Inventory

来源:互联网 发布:高洛峰 php教程 编辑:程序博客网 时间:2024/05/17 21:48

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;}


0 0
原创粉丝点击