题目链接: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. php中的htmlspecialchars_decode()函数

    htmlspecialchars_decode() 函数把一些预定义的 HTML 实体转换为字符. <?php $str = "This is some <b>bold&l ...

  2. web API .net - .net core 对比学习-文件目录概述

    个人正在学习.net web Api的相关知识,因此用这一系列博客做一记录. 1. 首先我们分别创建 .net web api 项目和 .net core web api 项目. 2. 我们首先比较一 ...

  3. ElementUI table中el-table-column怎么设置百分比显示。

    看文档找到一种方法,是把 width 换成 min-width ,就支持百分比显示啦 !

  4. Java操作JSON数据(2)--Gson操作JSON数据

    Gson是Google公司发布的一个开发源码的Java库,可用于将Java对象转换为JSON字符串,也可用于将JSON字符串转换为对应的Java对象.本介绍下Gson的基本使用方法,包括序列化和反序列 ...

  5. JDBC模糊查询的4种方式

    1:%放在占位符中              parameters.add("%"+familyMemberQueryBean.getFullName()+"%" ...

  6. 【RAC】 RAC For W2K8R2 安装--dbca创建数据库(七)

    [RAC] RAC For W2K8R2 安装--dbca创建数据库(七) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可 ...

  7. day 07 预科

    目录 异常处理 字符串内置方法 1.索引取值 2.切片 3.成员运算 4.for循环 5.len() 6.strip(): 默认去掉两端空格 7.lsteip()/rstrip(): 去左端/右端 空 ...

  8. centos7 docker安装Jenkins BlueOcean

    Jenkins是一款Java开发的跨平台持续集成和持续发布的开源项目,Jenkins已经作为各大公司进行CI/CD的首选工具.而BlueOcean是Jenkins推出的一个插件,其目的就是让程序员执行 ...

  9. golang的channel实现

    golang的channel实现位于src/runtime/chan.go文件.golang中的channel对应的结构是: // Invariants: // At least one of c.s ...

  10. ng add ng-zorro-antd 安装时报错 已经是管理员还需要权限Error: EPERM: operation not permitted, lstat 'C:\ngWorkspace\qd\node_modules\fsevents\node_modules'

    Error: EPERM: operation not permitted, lstat 'C:\ngWorkspace\qd\node_modules\fsevents\node_modules' ...