题目链接: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 ;
}

最新文章

  1. web前端学习部落22群开源分享 左边菜单导航
  2. 在Django中进行注册用户的邮件确认
  3. Load Average
  4. Titanium系列--Titanium的简介、Titanium Studio安装和配置(一)
  5. Emmet插件使用方法总结
  6. Python 2.7教程
  7. Hadoop常见错误解决
  8. PC-Lint安装配置与集成到VS2010
  9. [实变函数]3.1 外测度 (outer measure)
  10. 初步认识mongodb文件
  11. 1.4.8 拼凑在一起(putting the pieces together)
  12. ubuntu 停在开机界面
  13. Easyui 生成layout
  14. CentOS 7 之Shell学习笔记
  15. JqueryUI插件网络连接
  16. android _scrollview嵌套listview出现高度显示不全解决方案
  17. [整理]MongoDB 经常使用命令总结
  18. MySQL innodb_table_monitor 解析
  19. Node.js Net 模块
  20. django系列4 :创建管理员

热门文章

  1. JS中的逻辑运算符&amp;&amp;、||
  2. rabbitmq监控之消息确认ack
  3. loj#10013 曲线(三分)
  4. Python进阶(六)----装饰器
  5. 《区块链DAPP开发入门、代码实现、场景应用》笔记2——Solidity实现简单的智能合约
  6. 使用cmd命令行登录mysql并查看mysql状态
  7. JS去除字符串中的中括号
  8. 创建Spring boot project报错:Project build error: Non-resolvable parent POM for xxx:0.0.1-SNAPSHOT: Could not transfer artifact org.springframework.boot:spring-boot-starter-parent
  9. Java 缓存实例
  10. Java文件流下载并提示文件不存在