codeforces864D. Make a Permutation!(贪心)
2017-09-26 14:23
357 查看
题意:
给你一个长度为n的序列,元素大小为1~n。让你修改某些元素值,使得整个序列出现的元素不重复(修改值范围为1~N);求在修改操作数最少的前提下,使得修改后的序列字典序最小,
思路:
贪心;由题意知道修改操作最少为1~n没出现过的数的个数。要使得字典序最小,那么就要从头部开始插入,平且插入可选的最小值t(可用优先队列预处理)。
当某个位置的数num出现次数大于二,那么可进行插入判断。两种情况:
1.t<num,,可直接插入
2.t>num。。如果后面直接插入,字典序不是最小的,那么当前数为num,那么往后出现num,不管num与t的大小如何,都必须插入。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
int arr[maxn];
priority_queue<int,vector<int>,greater<int> > pq;
int vis[maxn];
int pd[maxn];
int main()
{
int n;
cin>>n;
int cnt = 0;
memset(vis,0,sizeof(vis));
memset(pd,0,sizeof(pd));
for(int i = 1;i<=n;i++)
scanf("%d",arr+i),vis[arr[i]]++;
for(int i = 1;i<=n;i++)
if(!vis[i])
pq.push(i),cnt++;
for(int i = 1;i<=n;i++)
{
int num= arr[i];
if(vis[num]>=2)
{
int t = pq.top();
if(pd[num]||t<num)
{
arr[i] = t;
vis[num]--;
pq.pop();
}
else
{
pd[num] = 1;
}
}
}
cout<<cnt<<endl;
for(int i = 1;i<n;i++)
cout<<arr[i]<<" ";
cout<<arr
<<endl;
}
给你一个长度为n的序列,元素大小为1~n。让你修改某些元素值,使得整个序列出现的元素不重复(修改值范围为1~N);求在修改操作数最少的前提下,使得修改后的序列字典序最小,
思路:
贪心;由题意知道修改操作最少为1~n没出现过的数的个数。要使得字典序最小,那么就要从头部开始插入,平且插入可选的最小值t(可用优先队列预处理)。
当某个位置的数num出现次数大于二,那么可进行插入判断。两种情况:
1.t<num,,可直接插入
2.t>num。。如果后面直接插入,字典序不是最小的,那么当前数为num,那么往后出现num,不管num与t的大小如何,都必须插入。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
int arr[maxn];
priority_queue<int,vector<int>,greater<int> > pq;
int vis[maxn];
int pd[maxn];
int main()
{
int n;
cin>>n;
int cnt = 0;
memset(vis,0,sizeof(vis));
memset(pd,0,sizeof(pd));
for(int i = 1;i<=n;i++)
scanf("%d",arr+i),vis[arr[i]]++;
for(int i = 1;i<=n;i++)
if(!vis[i])
pq.push(i),cnt++;
for(int i = 1;i<=n;i++)
{
int num= arr[i];
if(vis[num]>=2)
{
int t = pq.top();
if(pd[num]||t<num)
{
arr[i] = t;
vis[num]--;
pq.pop();
}
else
{
pd[num] = 1;
}
}
}
cout<<cnt<<endl;
for(int i = 1;i<n;i++)
cout<<arr[i]<<" ";
cout<<arr
<<endl;
}
相关文章推荐
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- Codeforces 864D - Make a Permutation! 【贪心】
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- Codeforces Round #436 D.Make a Permutation!(贪心)
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- Codeforces Round #436 (Div. 2)-贪心-D. Make a Permutation!
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- 【贪心】Codeforces Round #436 (Div. 2) D. Make a Permutation!
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- 【CodeForces】500B - New Year Permutation(Floyd)(贪心)
- Codeforces Round #436 (Div. 2) D. Make a Permutation!
- ACDream 1734 Can you make a water problem?(贪心)