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 ...
随机推荐
- 如何获取图片上传OSS后的缩略图 超简单
OSS是使用通过URL尾部的参数指定图片的缩放大小 图片路径后面拼接如下路径: ?x-oss-process=image/[处理类型],x_100,y_50[宽高等参数] ?x-oss-pro ...
- java基础 String
标准格式:数据类型[] 数组名称 = new 数据类型[] {元素1,元素2,...};省略格式:数据类型[] 数组名称 = {元素1,元素2,...}; Scanner类实现的功能,可以实现键盘输入 ...
- springmvc 注解二
@SessionAttributes @sessionattributes注解应用到Controller上面,可以将Model中的属性同步到session作用域当中. SessionAttribute ...
- 如何统一管理单个任务下所有API的同步情况?
1. 一分钟完成单个API配置 单个API的配置包含:API名称.URL地址.请求方式.参数设置.自定义高级设置. 参数允许用户填写:Text.WebService.Timestamp.DependO ...
- Guava Cache用法介绍
背景 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用.在日长开发有很多场合,有一些数据量不是很大,不会经常改动,并且访问非常频繁.但是由于受限于硬盘IO的性能或者远程网络 ...
- postman 在pre-request中发送application/x-www-form-urlencoded 格式表单
postman中在pre-request 发送请求 知识点: json数据解析和遍历 application/x-www-form-urlencoded表单 Array基本使用 js函数 http请求 ...
- 【python】文件下载---基础版
基于TCP协议的基础版本,不支持大文件 Client.py import socket def main(): # 1. 创建套接字 tcp_socket = socket.socket(socket ...
- day 06 预科
目录 if判断 if判断习题 for循环 for循环习题 微信机器人 if判断 # 一条狗朝你过来了,你会干吗? 判断: 如果狗是大长腿牵来的狗--->打招呼:如果是条疯狗,跑. # if:如果 ...
- unittest管理接口用例(数据分离-读取excel)
1.简单读取 #coding=utf-8 #调用封装好的excel读取公共方法 from python_API.common.ReadExcel import ReadExcel import req ...
- GNS3、Wireshark、SecureCRT 环境部署
本次GNS3环境部署教程基于官方推荐的稳定版1.5.4.初次接触此软件,详细的使用方法不是很清楚,所以以此作为学习记录,仅供参考,后期补充. 软件介绍 GNS3 GNS3是一款具有图形化界面可以运行在 ...