这道题的思路并不难,贪心+模拟,每次把没出现的往前排就可以,但是当时比赛时这道题反复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;
}