Balanced Ternary String(贪心+思维)
题目大意:给一个字符串,这个字符串只由0,1,2构成,然后让替换字符,使得在替换字符次数最少的前提下,使新获得的字符串中0,1,2
这三个字符的数目相同,并且新获得的字符串的字典序要尽可能的小;
直接数组做法:暴力遍历
/* */
# include <bits/stdc++.h>
using namespace std;
typedef long long ll; int n;
int c[];
string s;
int main()
{
ios_base::sync_with_stdio(false);
cin>>n>>s;
memset(c, , sizeof(c)); for(int i=; i<n; i++ )
c[s[i]-'']++;
for(int i=; i<n&&c[]<n/; i++ )///0不够的时候从前往后换
{
if( c[s[i]-'']<=n/ )
continue;
if( s[i]!='' )///只要不是0,且多就换
{
c[s[i]-'']--;
s[i] = '';
c[s[i]-'']++;
}
} for(int i=n-; i>=&&c[]<n/; i-- )///2不够的时候从后往前换
{
if( c[s[i]-'']<=n/ )
continue;
if( s[i]!='' )///只要不是2,且多就换
{
c[s[i]-'']--;
s[i] = '';
c[s[i]-'']++;
}
} for(int i=; i<n&&c[]<n/; i++ )///1不够的时候,从前往后换
{
if(c[s[i]-'']<=n/ )
continue;
if( s[i]=='' )///先把多出来的2换了,不能换多的0,多的0要从后面换,否则字典序就大了
{
c[s[i]-'']--;
s[i]='';
c[s[i]-'']++;
}
} for(int i=n-; i>= && c[]<n/; i-- )///1还不够,从后往前换
{
if( c[s[i]-'']<=n/ )
continue;
if( s[i]!='' )///只要不是1,并且多就换
{
c[s[i]-'']--;
s[i]='';
c[s[i]-'']++;
}
}
cout<<s<<endl;
return ;
}
用双向队列来做,跟数组做法一个思维,双向队列用来记录0,1,2的位置
/* */
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
deque<int>num[]; int main()
{
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int n;
cin>>n;
string a;
cin>>a; for(int i=; i<n; i++ )
num[a[i]-''].push_back(i);///向队列位加入0,1,2的位置,num[0]记录0的位置,num[1]记录1的位置,num[2]记录2的位置
int k=n/;
if( num[].size()==num[].size() && num[].size()==num[].size())
cout<<a<<endl;
else
{
if( num[].size()>k )///2多,从前往后,先换成0,再换成1
{
while( num[].size()>k && num[].size()<k )
{
int pos = num[].front();
num[].pop_front();
a[pos] = '';
num[].push_front(pos);
}
while( num[].size()>k && num[].size()<k )
{
int pos = num[].front();
num[].pop_front();
a[pos] = '';
num[].push_front(pos);
}
} if( num[].size()>k )///1多,从前往后换成0,从后往前换成2
{
while( num[].size()>k && num[].size()<k )
{
int pos = num[].back();
num[].pop_back();
a[pos] = '';
num[].push_back(pos);
} while( num[].size()>k && num[].size()<k )
{
int pos=num[].front();
num[].pop_front();
a[pos] = '';
num[].push_front(pos);
}
} if( num[].size()>k )///0多,从后往前先换成2,再换成1
{
while( num[].size()>k && num[].size()<k )
{
int pos = num[].back();
num[].pop_back();
a[pos] = '';
num[].push_back(pos);
} while( num[].size()>k && num[].size()<k )
{
int pos = num[].back();
num[].pop_back();
a[pos] = '';
num[].push_back(pos);
}
}
cout<<a<<endl;
}
return ;
}
Balanced Ternary String(贪心+思维)的更多相关文章
- Codeforces Round #531 (Div. 3) D. Balanced Ternary String (贪心)
题意:给你一个长度为\(3*n\)的字符串,要求修改最少的次数,使得字符串中\(0,1,2\)的个数相同,并且在最少次数的情况下使字典序最小. 题解:贪心,\(0\)一定放在前面,\(1\)和\(2\ ...
- Balanced Ternary String CodeForces - 1102D (贪心+思维)
You are given a string ss consisting of exactly nn characters, and each character is either '0', '1' ...
- D - Balanced Ternary String (贪心)
题目链接:http://codeforces.com/contest/1102/problem/D 题目大意:给你一个字符串,这个字符串是由0,1,2构成的,然后让你替换字符,使得在替换的次数最少的前 ...
- codeforces ~ 1009 B Minimum Ternary String(超级恶心的思维题
http://codeforces.com/problemset/problem/1009/B B. Minimum Ternary String time limit per test 1 seco ...
- CF1009B Minimum Ternary String 思维
Minimum Ternary String time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Mike and distribution CodeForces - 798D (贪心+思维)
题目链接 TAG: 这是我近期做过最棒的一道贪心思维题,不容易想到,想到就出乎意料. 题意:给定两个含有N个正整数的数组a和b,让你输出一个数字k ,要求k不大于n/2+1,并且输出k个整数,范围为1 ...
- 牛客多校第四场 A Ternary String
题目描述 A ternary string is a sequence of digits, where each digit is either 0, 1, or 2. Chiaki has a t ...
- Codeforces Round #546 (Div. 2) D 贪心 + 思维
https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...
- 2018牛客网暑期ACM多校训练营(第四场) A - Ternary String - [欧拉降幂公式][扩展欧拉定理]
题目链接:https://www.nowcoder.com/acm/contest/142/A 题目描述 A ternary string is a sequence of digits, where ...
随机推荐
- volatile-最轻量级的并发实现及其内存语义
原文连接:(http://www.studyshare.cn/blog/details/1163/0 ) 一.volatile定义 volatile是java并发编程中修饰类的成员变量.成员属性或者对 ...
- 2019 东方明珠java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.东方明珠等公司offer,岗位是Java后端开发,最终选择去了东方明珠. 面试了很多家公司,感觉大部分公司考察的点 ...
- codeforces Round #568(Div.2)A B C
有点菜,只写出了三道.活不多说,上题开干. A. Ropewalkers Polycarp decided to relax on his weekend and visited to the per ...
- vue中is与:is的区别
简略回答 假设父组件中有一个show数据,show="one":is="show"-->实际上是is="one" is="s ...
- minikube国内在线部署体验
问题描述: 快速学习k8s的各个组件的作用及yml的编写,minikube很适合. how to install Minikube, a tool that runs a single-node Ku ...
- 基于glew,freeglut的imshow
OpenGL显示图片,这篇博客使用glew + freeglut + gdal来实现imshow. 主要修改: 使用BGR而不是RGB,保持和opencv行为一致 纯C,去掉C++相关的 去掉GDAL ...
- 安装python工具
安装python编写工具 本篇幅只限于安装linux系统上. 想要实现linux程序在windows桌面上打开,需要在linux上打开X11forward和在windows上安装Xmanager ID ...
- 嵌入式LINUX启动时间优化
1. 实践过程 我是对海思3559进行启动时间优化的.具体的操作可以参考<Hi3559V100/Hi3556V100 快速启动优化指南>.软件上启动时间的优化一般是从三方面进行的:ubbo ...
- CentOS 7 的 redis 安装
redis 安装 使用下面的命令,下载.解压.编译Redis: $ wget http://download.redis.io/releases/ $ tar xzf redis-x.x.x.tar. ...
- 类X509Certificate2
X509Certificate2类的初始化. 文章:使用X509Certificate2类操作证书文件 参考:https://docs.microsoft.com/zh-cn/dotnet/api/s ...