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 ...
随机推荐
- KIP-382: MirrorMaker 2.0
Status Motivation Public Interfaces Proposed Changes Remote Topics, Partitions Aggregation Cycle det ...
- C#字符串基础
C#字符串基础 1. 字符串的两种创建形式 (1)String A=”cat”; (2)String B=new string{‘a’,4} .调用类方法,创建一个“aaaa”的字符串 (3) ...
- pandas-04 多级index操作
pandas-04 多级index操作 在pandas中可以为series和dataframe设置多个index,也就是说可以有多级index和column.这样可以对pandas的操作更加灵活. i ...
- .python3基础之“术语表(1)”
1.注释: 行首有一特殊标志符号运行时告知编程忽略此行:使代码更易于阅读. 例如: #这是一个注释 print("hello world") #print() 方法用于打印输出,p ...
- Docker 安装HDFS
网上拉取Docker模板,使用singlarities/hadoop镜像 [root@localhost /]# docker pull singularities/hadoop 查看: [root@ ...
- Linux命令——lsblk
参考:Linux lsblk Command Tutorial for Beginners (8 Examples) 简介 lsblk可以看成是“List block device”的缩写,即列为出所 ...
- c风格的字符串
c风格的字符串的标注库 #include <cstring> 使用c 风格的字符串,牢记,其必须以null为结束标志 如 char ca[]={'c','+','='}; cout< ...
- javascript数据结构与算法——栈
前言: 栈就是和列表类似的一种数据结构,不过栈的特点是'后人先出'.栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现. 1. 栈的介绍: 栈是一种特殊的列表,栈内的 ...
- 聊聊ThreadLocal源码(基于JDK1.8)
原文:https://cloud.tencent.com/developer/article/1333298 聊聊JDK源码中ThreadLocal的实现 主要方法: ThreadLocal的get方 ...
- 调试中行支付demo
用eclipse调试中行支付demo,本来报错. 让我同学帮我远程看了下,他删了服务器,又添加服务器,然后竟然可以运行了,牛逼! 原来报错: at java.net.URLClassLoader$1. ...