题目链接: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(贪心+思维)的更多相关文章

  1. Codeforces Round #531 (Div. 3) D. Balanced Ternary String (贪心)

    题意:给你一个长度为\(3*n\)的字符串,要求修改最少的次数,使得字符串中\(0,1,2\)的个数相同,并且在最少次数的情况下使字典序最小. 题解:贪心,\(0\)一定放在前面,\(1\)和\(2\ ...

  2. Balanced Ternary String CodeForces - 1102D (贪心+思维)

    You are given a string ss consisting of exactly nn characters, and each character is either '0', '1' ...

  3. D - Balanced Ternary String (贪心)

    题目链接:http://codeforces.com/contest/1102/problem/D 题目大意:给你一个字符串,这个字符串是由0,1,2构成的,然后让你替换字符,使得在替换的次数最少的前 ...

  4. codeforces ~ 1009 B Minimum Ternary String(超级恶心的思维题

    http://codeforces.com/problemset/problem/1009/B B. Minimum Ternary String time limit per test 1 seco ...

  5. CF1009B Minimum Ternary String 思维

    Minimum Ternary String time limit per test 1 second memory limit per test 256 megabytes input standa ...

  6. Mike and distribution CodeForces - 798D (贪心+思维)

    题目链接 TAG: 这是我近期做过最棒的一道贪心思维题,不容易想到,想到就出乎意料. 题意:给定两个含有N个正整数的数组a和b,让你输出一个数字k ,要求k不大于n/2+1,并且输出k个整数,范围为1 ...

  7. 牛客多校第四场 A Ternary String

    题目描述 A ternary string is a sequence of digits, where each digit is either 0, 1, or 2. Chiaki has a t ...

  8. Codeforces Round #546 (Div. 2) D 贪心 + 思维

    https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...

  9. 2018牛客网暑期ACM多校训练营(第四场) A - Ternary String - [欧拉降幂公式][扩展欧拉定理]

    题目链接:https://www.nowcoder.com/acm/contest/142/A 题目描述 A ternary string is a sequence of digits, where ...

随机推荐

  1. KIP-382: MirrorMaker 2.0

    Status Motivation Public Interfaces Proposed Changes Remote Topics, Partitions Aggregation Cycle det ...

  2. C#字符串基础

    C#字符串基础 1.    字符串的两种创建形式 (1)String A=”cat”; (2)String B=new string{‘a’,4}  .调用类方法,创建一个“aaaa”的字符串 (3) ...

  3. pandas-04 多级index操作

    pandas-04 多级index操作 在pandas中可以为series和dataframe设置多个index,也就是说可以有多级index和column.这样可以对pandas的操作更加灵活. i ...

  4. .python3基础之“术语表(1)”

    1.注释: 行首有一特殊标志符号运行时告知编程忽略此行:使代码更易于阅读. 例如: #这是一个注释 print("hello world") #print() 方法用于打印输出,p ...

  5. Docker 安装HDFS

    网上拉取Docker模板,使用singlarities/hadoop镜像 [root@localhost /]# docker pull singularities/hadoop 查看: [root@ ...

  6. Linux命令——lsblk

    参考:Linux lsblk Command Tutorial for Beginners (8 Examples) 简介 lsblk可以看成是“List block device”的缩写,即列为出所 ...

  7. c风格的字符串

    c风格的字符串的标注库 #include <cstring> 使用c 风格的字符串,牢记,其必须以null为结束标志 如 char ca[]={'c','+','='}; cout< ...

  8. javascript数据结构与算法——栈

    前言: 栈就是和列表类似的一种数据结构,不过栈的特点是'后人先出'.栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现. 1. 栈的介绍: 栈是一种特殊的列表,栈内的 ...

  9. 聊聊ThreadLocal源码(基于JDK1.8)

    原文:https://cloud.tencent.com/developer/article/1333298 聊聊JDK源码中ThreadLocal的实现 主要方法: ThreadLocal的get方 ...

  10. 调试中行支付demo

    用eclipse调试中行支付demo,本来报错. 让我同学帮我远程看了下,他删了服务器,又添加服务器,然后竟然可以运行了,牛逼! 原来报错: at java.net.URLClassLoader$1. ...