您的位置:首页 > 其它

Codeforces 569B Inventory

2015-08-11 09:18 489 查看
题目链接:

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
);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: