• 2014年亚洲区域赛牡丹江站k题(贪心算法)


    牡丹江K题,题目的目的就是达到每一时刻数字的个数>*号的个数即可,但是最后一个字符必须保证是*号,这样最优先就是所有数字都尽量在前面,所有*号都尽量住后面,尽量交换,因为交换的相当于插入两个数,如果开始的时候*的总个数比数字多,则先补齐。下面是ac代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <queue>
    #include <vector>
    
    using namespace std;
    
    char s[3000];
    int len;
    
    void Insert(int n)
    {
        for(int i=len+n-1;i>=n;i--)
        {
            s[i]=s[i-n];
        }
        for(int i=0;i<n;i++)
        {
            s[i]='1';
        }
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%s",s);
            int cnt1=0,cnt2=0,cnt=0;
            len=strlen(s);
            for(int i=0;i<len;i++)
            {
                if(s[i]=='*')
                {
                    cnt2++;
                }
                else
                {
                    cnt1++;
                }
            }
            if(cnt1<=cnt2)
            {
                Insert(cnt2-cnt1+1);
                cnt+=(cnt2-cnt1+1);
                len+=(cnt2-cnt1+1);
            }
            cnt1=cnt2=0;
            if(s[0]=='*')
            {
                for(int i=len-1;i>=0;i--)
                {
                    if(s[i]!='*')
                    {
                        char tem=s[i];
                        s[i]=s[0];
                        s[0]=tem;
                        cnt++;
                        break;
                    }
                }
            }
            for(int i=0;i<len;i++)
            {
                if(s[i]=='*')
                {
                    cnt2++;
                }
                else cnt1++;
                if(cnt2==cnt1)
                {
                    for(int j=len-1;j>i;j--)
                    {
                        if(s[j]!='*')
                        {
                            char tem=s[j];
                            s[j]=s[i];
                            s[i]=tem;
                            cnt1++;
                            cnt2--;
                            cnt++;
                            break;
                        }
                    }
                }
            }
            if((cnt2!=0) && (s[len-1]!='*'))
            {
                cnt++;
            }
            printf("%d
    ",cnt);
        }
        return 0;
    }
    


  • 相关阅读:
    linux下的apue.3e安装[Unix环境高级编程]
    mysql将主键序号置为1
    玛丽全开-许愿池
    redis学习之路

    jvm
    oracle版本号含义
    oracle查看所有的表空间
    oracle存储过程 package
    oracle同义词创建(synonym)
  • 原文地址:https://www.cnblogs.com/hqwhqwhq/p/4555893.html
Copyright © 2020-2023  润新知