Make a Permutation! CodeForces - 864D 解题报告

这道题的思路并不难,贪心+模拟,每次把没出现的往前排就可以,但是当时比赛时这道题反复WA了很多次,就是没过,比赛完看别人的代码,才发现自己忽略了一个限制条件,那就是重复数有多个,且含有最大的值得情况(QAQ),每次都离AC差了那么点,唉

题目链接

下面给出WA的代码,以示警戒:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int used[maxn],t[maxn],s[maxn];
bool ok[maxn];

int main()
{
    int n;  scanf("%d",&n);

    memset(used,0,sizeof(used));
    memset(ok,0,sizeof(ok));
    for(int i=1;i<=n;i++)
    {
        int a; scanf("%d",&a);
        t[i]=a; used[a]++;
    }

    priority_queue<int ,vector<int>,greater<int> > que;
    for(int i=1;i<=n;i++)
        if(!used[i])  que.push(i);
    for(int i=1;i<=n;i++)
    {
        if(used[t[i]]>1&&(que.top()<t[i]||(que.top()>=t[i]&&ok[t[i]]==true)))
        {
            s[i]=que.top();
            que.pop();
        }
        else
        {
            s[i]=t[i];
            if(used[t[i]]>1) ok[t[i]]=true;
        }
    }

    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(t[i]!=s[i]) cnt++;
    }

    printf("%d\n",cnt);
    for(int i=1;i<=n;i++)
    {
        if(i-1) printf(" ");
        printf("%d",s[i]);
    }
    return 0;
}

再给出AC代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int used[maxn],t[maxn],s[maxn];
bool ok[maxn];

int main()
{
    int n;  scanf("%d",&n);

    memset(used,0,sizeof(used));
    memset(ok,0,sizeof(ok));
    for(int i=1;i<=n;i++)
    {
        int a; scanf("%d",&a);
        t[i]=a; used[a]++;
    }

    priority_queue<int ,vector<int>,greater<int> > que;
    for(int i=1;i<=n;i++)
        if(!used[i])  que.push(i);
    for(int i=1;i<=n;i++)
    {
        if(used[t[i]]>1&&(que.top()<t[i]||(que.top()>=t[i]&&ok[t[i]]==true)))
        {
            used[t[i]]--;
            s[i]=que.top();
            que.pop();
            used[s[i]]++;
        }
        else
        {
            s[i]=t[i];
            if(used[t[i]]>1) ok[t[i]]=true;
        }
    }

    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(t[i]!=s[i]) cnt++;
    }

    printf("%d\n",cnt);
    for(int i=1;i<=n;i++)
    {
        if(i-1) printf(" ");
        printf("%d",s[i]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/NCC__dapeng/article/details/82054397