【贪心】Codeforces Round #436 (Div. 2) D. Make a Permutation!
题意:给你一个长度为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!相关推荐
- 贪心 Codeforces Round #236 (Div. 2) A. Nuts
题目传送门 1 /* 2 贪心:每一次选取最多的线段,最大能放置nuts,直到放完为止,很贪婪! 3 题目读不懂多读几遍:) 4 */ 5 #include <cstdio> 6 #inc ...
- 贪心 Codeforces Round #191 (Div. 2) A. Flipping Game
题目传送门 1 /* 2 贪心:暴力贪心水水 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cs ...
- 贪心 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]; ...
- 贪心 Codeforces Round #301 (Div. 2) B. School Marks
题目传送门 1 /* 2 贪心:首先要注意,y是中位数的要求:先把其他的都设置为1,那么最多有(n-1)/2个比y小的,cnt记录比y小的个数 3 num1是输出的1的个数,numy是除此之外的数都为 ...
- Codeforces Round #636 (Div. 3) F. Restore the Permutation by Sorted Segments 思维 + 暴力
传送门 文章目录 题意: 思路: 题意: n≤200n\le200n≤200 思路: 首先关注到rrr从[2,n][2,n][2,n]都出现一次,所以很明显最后一个位置只出现一次,但是这样倒着来不是很 ...
- 贪心 ---- Codeforces Round #618 (Div. 2)B. Assigning to Classes+贪心[证明过程]
题目链接 题目大意:给你2∗n2*n2∗n个数,将这些数分成2个集合使得两个集合中位数的差值最小 解题思路:我懵了一个结论就是排序之后取中间的两个数然后就ac了 我们先对这些数字从小到大排序 证明:1 ...
- Era 贪心 Codeforces Round #752 (Div. 2)
题意: 给一序列,每次操作是插入一个任意大小的数,求最小操作次数使得序列每个数值小于等于下标 思路: 对于每个值大于下标的数,在它前面填上恰好足够多的1,使值刚好等于下标即可,由于前面的数增加了1也会 ...
- Codeforces Round #354 (Div. 2) A. Nicholas and Permutation
Nicholas and Permutation time limit : 1 second memory limit: 256 megabytes 题目连接: http://www.codeforc ...
- Codeforces Round #776 (Div. 3)-D. Twist the Permutation
原题链接:https://codeforces.com/contest/1650/problem/D 解题思路: 仔细审题,会发现对第i个数字做的操作不会影响到后面的i+1-等数字.即可以反过来从最后 ...
最新文章
- linux删掉文件怎么恢复,linux系统误删除文件怎么恢复
- 高人对libsvm的经典总结(全面至极)
- 怎样允许远程访问mysql_如何开启MySQL远程访问权限 允许远程连接
- linq结果转换object_你知道Object.entries(),但你还知道有Object.fromEntries()吗?
- Jaxb2 转换XML文档
- 华硕路由器,创建虚拟内存 U 盘读写速度不够,在设置里开启usb3.0
- 设计模式学习(十七) 观察者模式 Observer
- 整理一下国内比较便宜的云主机
- windows打开rpm文件
- Python在线办公系统毕业设计源码071116
- max3490esa_MAX1661EUB-T_maxim芯片后缀tg16是什么意思
- Linux简介及常用命令
- Android 8.1 中Systemui中的常见修改(二)电池的修改
- Premiere Pro 2022 for Mac(pr2022)中文版
- 计算机网络第八章ppt,计算机网络-第八章.ppt
- 2011年5月18日
- 微信公众号全局返回码字典
- Win11居然还能启动Windows照片查看器
- 基于准则的结构化决策指南_如何记录团队技术决策的指南
- 一篇文章带你了解人工智能
热门文章
- Paper Review: Bayesian Regularization and Prediction
- windows令牌学习
- AES CBC模式下的CBC bit flipping Attack
- selenium3+python-多窗口、句柄(handle)
- sql 2008数据库日志清理(转)
- java应用高内存占用
- ubuntu网卡问题
- linux安装web服务器httpd,Linux_linux构建动态WEB服务器安装篇,基本配置 安装web服务器:httpd-2. - phpStudy...
- ai一个线段多个箭头_初学设计却分不清PS和AI?超详细的AI基础介绍包你一看即会!...
- 双中心单电子积分计算氢分子离子H2+的轨道能量