1102D. Balanced Ternary String

原题链接:http://codeforces.com/contest/1102/problem/D

题目大意:给出一个只含0,1,2的字符串序列,长度为N,要求通过最少的变换次数(0变为1或2;1变为2或0;2变为0或1)使串中0,1,2出现次数相等,并且字典序最小。

思路:暴力解决,强行通过个数大小关系进行修改,思维图如下:

1102D. Balanced Ternary String_第1张图片

代码:

#include
#include
#include
using namespace std;
int n;
char str[300100];///输入字符串
priority_queue ,less >a,b,c;///大到小队列(不会双向所以只能这样了)

int main()
{
    cin>>n;///总数
    int m = n/3;///平均数
    int aa, bb, cc;///012数量
    aa = bb = cc = 0;
    for(int i = 0; i < n; i++)///输入&&记录
    {
        cin>>str[i];
        if(str[i] == '0')
        {
            a.push(i);
            aa++;
        }
        if(str[i] == '1')
        {
            b.push(i);
            bb++;
        }
        if(str[i] == '2')
        {
            c.push(i);
            cc++;
        }
    }
    if(aa==bb&&bb==cc)///特殊情况
    {
        cout<m)
    {
        if(bb>m)
        {
            for(int i=0;im)
            {
                for(int i=0;im)
        {
            if(cc>m)
            {
                for(int i=0;i

 

你可能感兴趣的:(贪心,字符串,Codeforces)