Codeforces 723c [贪心][乱搞]
/*
不要低头,不要放弃,不要气馁,不要慌张。
题意:
给一个n和m。
第二行给n个数。
每次操作可以把n个数中的任何一个数替代为别的数,问最少的操作次数使得1.2.3.4.5...m中的数出现的次数的最小值尽可能大。
输出这个数,输出最少操作次数,输出替换后的数组。
思路:
1.显然,最小值尽可能大,这个值是可以确定的,即n/m;
2.还有,为使得操作次数最少,我们发现最多有n%m个没有贡献的无关值无需更改...
3.这题实际上可以n^2复杂度,因为n只有2000.但是本渣作死,写了nloglog的复杂度...
n^2复杂度的话循环检查就好...
我是用一个map<int,multiset<int> >将数字的位置记录下来...然后种种... 坑:
if else if else这种逻辑写崩了==仍然很弱的我
逻辑逻辑逻辑 */ #include<bits/stdc++.h>
using namespace std;
int jilu[],all[];
map<int,multiset<int> >mp;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",jilu+i);
all[i]=jilu[i];
mp[jilu[i]].insert(i);
}
int k=n/m;
int w=n%m;
map<int,multiset<int> >::iterator it;
multiset<int>cun;
multiset<int>que;
for(it=mp.begin();it!=mp.end();it++){
if(it->first <= m){
while(it->second.size()<k){
if(cun.size()){
int ss=*cun.begin();
cun.erase(cun.begin());
jilu[ss]=it->first;
it->second.insert(ss);
}
else{
que.insert(it->first);
it->second.insert();
}
}
while(it->second.size() > k){
if(w>){
w--;
it->second.erase(it->second.begin());
}
else if(que.size()){
int ss=*que.begin();
que.erase(que.begin());
int pos=*(it->second.begin());
it->second.erase(it->second.begin());
jilu[pos]=ss;
}
else{
int pos=*(it->second.begin());
it->second.erase(it->second.begin());
cun.insert(pos);
}
}
}
else{
while(it->second.size() > ){
if(w>){
w--;
it->second.erase(it->second.begin());
}
else if(que.size()){
int ss=*que.begin();
que.erase(que.begin());
int pos=*(it->second.begin());
it->second.erase(it->second.begin());
jilu[pos]=ss;
}
else{
int pos=*(it->second.begin());
it->second.erase(it->second.begin());
cun.insert(pos);
}
}
}
}
for(int i=;i<=m;i++){
while(mp[i].size()<k){
int ss=*cun.begin();
cun.erase(cun.begin());
jilu[ss]=i;
mp[i].insert(ss);
}
}
while(que.size()){
int pos=*cun.begin();
int ss=*que.begin();
cun.erase(cun.begin());
que.erase(que.begin());
jilu[pos]=ss;
}
int num=;
for(int i=;i<=n;i++){
if(jilu[i]!=all[i])num++;
}
printf("%d %d\n",k,num);
for(int i=;i<=n;i++){
printf("%d ",jilu[i]);
}
}
Codeforces 723c [贪心][乱搞]的更多相关文章
- CodeForces 509C Sums of Digits(贪心乱搞)题解
题意:a是严格递增数列,bi是ai每一位的和,告诉你b1~bn,问你怎样搞才能让an最小 思路:让ai刚好大于ai-1弄出来的an最小.所以直接模拟贪心,如果当前位和前一个数的当前位一样并且后面还能生 ...
- [CF752D]Santa Claus and a Palindrome(优先队列,贪心乱搞)
题目链接:http://codeforces.com/contest/752/problem/D 题意:给长度为k的n个字符串,每一个字符串有权值,求构造一个大回文串.使得权值最大. 因为字符串长度都 ...
- [luoguP1053] 篝火晚会(贪心 + 乱搞)
传送门 假设第一个位置是1,那么枚举它的左右两边是谁,有两种情况,然后可以递推求出序列. 然后可以贪心,两个序列有多少个不同的数,答案就是多少,具体为啥,yy一下即可 然后就是判断递推求出的序列和目标 ...
- Codeforces 724C [坐标][乱搞][模拟]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 从(0,0)出发与x轴正方向呈45度角的射线,在给定的矩形区域内不断发射,直到射入矩形的某个角停止. 给出多个坐标,问光线最早经过某坐标的时间. ...
- FJNU2018低程F jq解救fuls (贪心乱搞)题解
题目描述 一天fuls被邪恶的"咕咕咕"抓走了,jq为了救fuls可谓是赴汤蹈火,费了九牛二虎之力才找到了"咕咕咕"关押fuls的地方. fuls被关在一个机关 ...
- hdu4714树形DP+贪心(乱搞)
Tree2cycle A tree with N nodes and N-1 edges is given. To connect or disconnect one edge, we need 1 ...
- codeforces 1041 c 乱搞
#include <bits/stdc++.h> using namespace std; struct po { int val; int id; }; po a[]; vector&l ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)(A.暴力,B.优先队列,C.dp乱搞)
A. Carrot Cakes time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
随机推荐
- linux getch()实现
#include <termio.h> int getch(void){ struct termios tm, tm_old; int fd = 0, ch; ...
- 一个getjson()方式调用实例【前后台】,适于跨域访问。
题记:首次发个随笔,把以前写的一个笔记发过来,劝当记录,以供查询. jquery的推出确实解决了大部分程序员都感到头痛的事情,无论是对于UI的访问和处理,还是在一系列的远程访问等方面都有了很大的改善, ...
- python3 reqeuests给OSC全站用户刷积分
严格来讲是给在OSC上贡献过内容的OSC用户刷积分. OSC很多操作都需要消耗积分,很多人给OSC贡献了内容, 但是却没有人点赞,所以有些人在OSC混了很多年也没有积分. 本文中使用到的工具有gifc ...
- java基础介绍(转)
很全面的介绍JAVA基础的文档 Java 编程简介,第 1 部分: Java 语言基础 http://www.ibm.com/developerworks/cn/java/j-introtojava1 ...
- 搭建Tomcat6源代码阅读环境
目标:使用MyEclipse8.5阅读Tomcat6源码. 第一步:在MyEclipse8.5中集成SVN插件. 第二步:从地址http://svn.apache.org/repos/asf/tomc ...
- DIY FSK RFID Reader
This page describes the construction of an RFID reader using only an Arduino (Nano 3.0 was tested, b ...
- 第一章 ------ AutoYout介绍
1.使用自动布局的好处: (1)让两个视图进行尺寸匹配,使两个视图始终保持相同的宽度 (2)无论父视图如何改变,视图都可以相对于父视图居中 (3)拜放一行视图时将几个视图的底部对齐 (4)将两个视图偏 ...
- 黑马程序员——【Java基础】——集合框架
---------- android培训.java培训.期待与您交流! ---------- 一.集合框架概述 (一)集合框架中集合类关系简化图 (二)为什么出现集合类? 面向对象语言对事物的体现都是 ...
- Solidworks安装界面是英文的解决办法
[问题描述] 一样的安装文件,同事之前安装界面就是中文的,安装好以后软件也是中文的. 这几天系统挂了,重装系统后就发现安装界面是英文的,安装好以后也是英文. win7系统,位数不详,solidwork ...
- checkbox提交多组数据到action
突然想通过checkbox来提交多组数据到action,一时间想不起来怎么写,到网上流岚大婶们的笔迹之后,有了新发现! 方法一: 在action用一个String类型的变量来接受checkbox传过来 ...