题目链接:Balanced Ternary String

题目大意:给一个字符串,这个字符串只由0,1,2构成,然后让替换字符,使得在替换字符次数最少的前提下,使新获得的字符串中0,1,2

      这三个字符的数目相同,并且新获得的字符串的字典序要尽可能的小;


直接数组做法:暴力遍历

  1. /* */
  2. # include <bits/stdc++.h>
  3. using namespace std;
  4. typedef long long ll;
  5.  
  6. int n;
  7. int c[];
  8. string s;
  9. int main()
  10. {
  11. ios_base::sync_with_stdio(false);
  12. cin>>n>>s;
  13. memset(c, , sizeof(c));
  14.  
  15. for(int i=; i<n; i++ )
  16. c[s[i]-'']++;
  17. for(int i=; i<n&&c[]<n/; i++ )///0不够的时候从前往后换
  18. {
  19. if( c[s[i]-'']<=n/ )
  20. continue;
  21. if( s[i]!='' )///只要不是0,且多就换
  22. {
  23. c[s[i]-'']--;
  24. s[i] = '';
  25. c[s[i]-'']++;
  26. }
  27. }
  28.  
  29. for(int i=n-; i>=&&c[]<n/; i-- )///2不够的时候从后往前换
  30. {
  31. if( c[s[i]-'']<=n/ )
  32. continue;
  33. if( s[i]!='' )///只要不是2,且多就换
  34. {
  35. c[s[i]-'']--;
  36. s[i] = '';
  37. c[s[i]-'']++;
  38. }
  39. }
  40.  
  41. for(int i=; i<n&&c[]<n/; i++ )///1不够的时候,从前往后换
  42. {
  43. if(c[s[i]-'']<=n/ )
  44. continue;
  45. if( s[i]=='' )///先把多出来的2换了,不能换多的0,多的0要从后面换,否则字典序就大了
  46. {
  47. c[s[i]-'']--;
  48. s[i]='';
  49. c[s[i]-'']++;
  50. }
  51. }
  52.  
  53. for(int i=n-; i>= && c[]<n/; i-- )///1还不够,从后往前换
  54. {
  55. if( c[s[i]-'']<=n/ )
  56. continue;
  57. if( s[i]!='' )///只要不是1,并且多就换
  58. {
  59. c[s[i]-'']--;
  60. s[i]='';
  61. c[s[i]-'']++;
  62. }
  63. }
  64. cout<<s<<endl;
  65. return ;
  66. }

用双向队列来做,跟数组做法一个思维,双向队列用来记录0,1,2的位置

  1. /* */
  2. # include <bits/stdc++.h>
  3. using namespace std;
  4. typedef long long ll;
  5. deque<int>num[];
  6.  
  7. int main()
  8. {
  9. ios::sync_with_stdio(false);
  10. cin.tie();
  11. cout.tie();
  12. int n;
  13. cin>>n;
  14. string a;
  15. cin>>a;
  16.  
  17. for(int i=; i<n; i++ )
  18. num[a[i]-''].push_back(i);///向队列位加入0,1,2的位置,num[0]记录0的位置,num[1]记录1的位置,num[2]记录2的位置
  19. int k=n/;
  20. if( num[].size()==num[].size() && num[].size()==num[].size())
  21. cout<<a<<endl;
  22. else
  23. {
  24. if( num[].size()>k )///2多,从前往后,先换成0,再换成1
  25. {
  26. while( num[].size()>k && num[].size()<k )
  27. {
  28. int pos = num[].front();
  29. num[].pop_front();
  30. a[pos] = '';
  31. num[].push_front(pos);
  32. }
  33. while( num[].size()>k && num[].size()<k )
  34. {
  35. int pos = num[].front();
  36. num[].pop_front();
  37. a[pos] = '';
  38. num[].push_front(pos);
  39. }
  40. }
  41.  
  42. if( num[].size()>k )///1多,从前往后换成0,从后往前换成2
  43. {
  44. while( num[].size()>k && num[].size()<k )
  45. {
  46. int pos = num[].back();
  47. num[].pop_back();
  48. a[pos] = '';
  49. num[].push_back(pos);
  50. }
  51.  
  52. while( num[].size()>k && num[].size()<k )
  53. {
  54. int pos=num[].front();
  55. num[].pop_front();
  56. a[pos] = '';
  57. num[].push_front(pos);
  58. }
  59. }
  60.  
  61. if( num[].size()>k )///0多,从后往前先换成2,再换成1
  62. {
  63. while( num[].size()>k && num[].size()<k )
  64. {
  65. int pos = num[].back();
  66. num[].pop_back();
  67. a[pos] = '';
  68. num[].push_back(pos);
  69. }
  70.  
  71. while( num[].size()>k && num[].size()<k )
  72. {
  73. int pos = num[].back();
  74. num[].pop_back();
  75. a[pos] = '';
  76. num[].push_back(pos);
  77. }
  78. }
  79. cout<<a<<endl;
  80. }
  81. return ;
  82. }

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. 如何获取图片上传OSS后的缩略图 超简单

    OSS是使用通过URL尾部的参数指定图片的缩放大小 图片路径后面拼接如下路径:     ?x-oss-process=image/[处理类型],x_100,y_50[宽高等参数] ?x-oss-pro ...

  2. java基础 String

    标准格式:数据类型[] 数组名称 = new 数据类型[] {元素1,元素2,...};省略格式:数据类型[] 数组名称 = {元素1,元素2,...}; Scanner类实现的功能,可以实现键盘输入 ...

  3. springmvc 注解二

    @SessionAttributes @sessionattributes注解应用到Controller上面,可以将Model中的属性同步到session作用域当中. SessionAttribute ...

  4. 如何统一管理单个任务下所有API的同步情况?

    1. 一分钟完成单个API配置 单个API的配置包含:API名称.URL地址.请求方式.参数设置.自定义高级设置. 参数允许用户填写:Text.WebService.Timestamp.DependO ...

  5. Guava Cache用法介绍

    背景 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用.在日长开发有很多场合,有一些数据量不是很大,不会经常改动,并且访问非常频繁.但是由于受限于硬盘IO的性能或者远程网络 ...

  6. postman 在pre-request中发送application/x-www-form-urlencoded 格式表单

    postman中在pre-request 发送请求 知识点: json数据解析和遍历 application/x-www-form-urlencoded表单 Array基本使用 js函数 http请求 ...

  7. 【python】文件下载---基础版

    基于TCP协议的基础版本,不支持大文件 Client.py import socket def main(): # 1. 创建套接字 tcp_socket = socket.socket(socket ...

  8. day 06 预科

    目录 if判断 if判断习题 for循环 for循环习题 微信机器人 if判断 # 一条狗朝你过来了,你会干吗? 判断: 如果狗是大长腿牵来的狗--->打招呼:如果是条疯狗,跑. # if:如果 ...

  9. unittest管理接口用例(数据分离-读取excel)

    1.简单读取 #coding=utf-8 #调用封装好的excel读取公共方法 from python_API.common.ReadExcel import ReadExcel import req ...

  10. GNS3、Wireshark、SecureCRT 环境部署

    本次GNS3环境部署教程基于官方推荐的稳定版1.5.4.初次接触此软件,详细的使用方法不是很清楚,所以以此作为学习记录,仅供参考,后期补充. 软件介绍 GNS3 GNS3是一款具有图形化界面可以运行在 ...