题意:给你一个长度为n的数组,每个元素都在1~n之间,要你改变最少的元素,使得它变成一个1~n的排列。在保证改动最少的基础上,要求字典序最小。

预处理cnt数组,cnt[i]代表i在原序列中出现的次数。b数组,代表没有出现过的数是哪些。b数组的长度就是答案。

b数组是从小到大排好的,然后for循环b数组,同时用一个指针p指着a数组的当前位置,最开始指向开头,如果cnt[a[p]]==1,就向后跳,否则再看 是否b[i]<a[p]或者a[p]这个数是否已经出现过了(用个hav数组表示a[p]是否已经再前面出现过了)。只要满足这两个条件之一,就可以让cnt[a[p]]--,然后把a[p]修改为b[i]。如此一定能保证字典序最小。

#include<cstdio>
using namespace std;
int n,a[200005],cnt[200005];
bool hav[200005];
int b[200005],e;
int main(){
//  freopen("d.in","r",stdin);scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%d",&a[i]);++cnt[a[i]];}for(int i=1;i<=n;++i){if(!cnt[i]){b[++e]=i;}}int p=1;for(int i=1;i<=e;++i){while(cnt[a[p]]==1 || (!hav[a[p]] && b[i]>a[p])){hav[a[p]]=1;++p;}--cnt[a[p]];a[p]=b[i];}printf("%d\n",e);for(int i=1;i<n;++i){printf("%d ",a[i]);}printf("%d\n",a[n]);return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/7596253.html

【贪心】Codeforces Round #436 (Div. 2) D. Make a Permutation!相关推荐

  1. 贪心 Codeforces Round #236 (Div. 2) A. Nuts

    题目传送门 1 /* 2 贪心:每一次选取最多的线段,最大能放置nuts,直到放完为止,很贪婪! 3 题目读不懂多读几遍:) 4 */ 5 #include <cstdio> 6 #inc ...

  2. 贪心 Codeforces Round #191 (Div. 2) A. Flipping Game

    题目传送门 1 /* 2 贪心:暴力贪心水水 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cs ...

  3. 贪心 Codeforces Round #273 (Div. 2) C. Table Decorations

    题目传送门 1 /* 2 贪心:排序后,当a[3] > 2 * (a[1] + a[2]), 可以最多的2个,其他的都是1个,ggr,ggb, ggr... ans = a[1] + a[2]; ...

  4. 贪心 Codeforces Round #301 (Div. 2) B. School Marks

    题目传送门 1 /* 2 贪心:首先要注意,y是中位数的要求:先把其他的都设置为1,那么最多有(n-1)/2个比y小的,cnt记录比y小的个数 3 num1是输出的1的个数,numy是除此之外的数都为 ...

  5. Codeforces Round #636 (Div. 3) F. Restore the Permutation by Sorted Segments 思维 + 暴力

    传送门 文章目录 题意: 思路: 题意: n≤200n\le200n≤200 思路: 首先关注到rrr从[2,n][2,n][2,n]都出现一次,所以很明显最后一个位置只出现一次,但是这样倒着来不是很 ...

  6. 贪心 ---- Codeforces Round #618 (Div. 2)B. Assigning to Classes+贪心[证明过程]

    题目链接 题目大意:给你2∗n2*n2∗n个数,将这些数分成2个集合使得两个集合中位数的差值最小 解题思路:我懵了一个结论就是排序之后取中间的两个数然后就ac了 我们先对这些数字从小到大排序 证明:1 ...

  7. Era 贪心 Codeforces Round #752 (Div. 2)

    题意: 给一序列,每次操作是插入一个任意大小的数,求最小操作次数使得序列每个数值小于等于下标 思路: 对于每个值大于下标的数,在它前面填上恰好足够多的1,使值刚好等于下标即可,由于前面的数增加了1也会 ...

  8. Codeforces Round #354 (Div. 2) A. Nicholas and Permutation

    Nicholas and Permutation time limit : 1 second memory limit: 256 megabytes 题目连接: http://www.codeforc ...

  9. Codeforces Round #776 (Div. 3)-D. Twist the Permutation

    原题链接:https://codeforces.com/contest/1650/problem/D 解题思路: 仔细审题,会发现对第i个数字做的操作不会影响到后面的i+1-等数字.即可以反过来从最后 ...

最新文章

  1. linux删掉文件怎么恢复,linux系统误删除文件怎么恢复
  2. 高人对libsvm的经典总结(全面至极)
  3. 怎样允许远程访问mysql_如何开启MySQL远程访问权限 允许远程连接
  4. linq结果转换object_你知道Object.entries(),但你还知道有Object.fromEntries()吗?
  5. Jaxb2 转换XML文档
  6. 华硕路由器,创建虚拟内存 U 盘读写速度不够,在设置里开启usb3.0
  7. 设计模式学习(十七) 观察者模式 Observer
  8. 整理一下国内比较便宜的云主机
  9. windows打开rpm文件
  10. Python在线办公系统毕业设计源码071116
  11. max3490esa_MAX1661EUB-T_maxim芯片后缀tg16是什么意思
  12. Linux简介及常用命令
  13. Android 8.1 中Systemui中的常见修改(二)电池的修改
  14. Premiere Pro 2022 for Mac(pr2022)中文版
  15. 计算机网络第八章ppt,计算机网络-第八章.ppt
  16. 2011年5月18日
  17. 微信公众号全局返回码字典
  18. Win11居然还能启动Windows照片查看器
  19. 基于准则的结构化决策指南_如何记录团队技术决策的指南
  20. 一篇文章带你了解人工智能

热门文章

  1. Paper Review: Bayesian Regularization and Prediction
  2. windows令牌学习
  3. AES CBC模式下的CBC bit flipping Attack
  4. selenium3+python-多窗口、句柄(handle)
  5. sql 2008数据库日志清理(转)
  6. java应用高内存占用
  7. ubuntu网卡问题
  8. linux安装web服务器httpd,Linux_linux构建动态WEB服务器安装篇,基本配置 安装web服务器:httpd-2. - phpStudy...
  9. ai一个线段多个箭头_初学设计却分不清PS和AI?超详细的AI基础介绍包你一看即会!...
  10. 双中心单电子积分计算氢分子离子H2+的轨道能量