• Educational Codeforces Round 82 (Rated for Div. 2)


    http://codeforces.com/contest/1303

    A:    第一题给一个只有01的字符串,操作是可以删除0,结果要保证1都是挨着的。问最小操作数。
         解析:特判,len=1是直接输出0。其他的就是找到第一个为1而且下一位为0的位置,以此往下找,找到第一个为1而且j!=i+1就可以了,减一下就是操作数。

      

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn = 1e3;
    
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            char s[maxn];
            cin>>s;
            int len=strlen(s);
            int sum=0;
            if(len==1)
                cout<<"0"<<endl;
            else
            {
                //int sum=0;
                for(int i=0;i<len;i++)
                {
                    if(s[i]=='1'&&s[i+1]=='0')
                    {
                        int k=-1;
                        for(int j=i+1;j<len;j++)
                        {
                            if(s[j]=='1'&&j!=i+1)
                            {
                                k=j;break;
                            }
                        }
                        if(k!=-1)
                            sum+=k-i-1;
                    }    
                }
                cout<<sum<<endl;
            }
        }
    }

    B

         给出路长度n,good天数和bad天数,good天里完成的修路的质量高。要求n的一半为高质量,而且要完成长度n的修建,问最少需要多少天。
    解析:  1.如果good>=n或者good>=n/2,直接输出n。
               2.算出完成上述目标需要的天数。根据周期来看,算出good周期数:n/2/g,  则bad周期数就是good周期数-1。而如果mid/g不能整除
        那么bad周期数还要+1。总公式就是:sum=bad周期数*bad+good周期数*good+n/2/g的余数。如果sum>n,输出n,否则输入sum

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int maxn = 1e3;
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            ll n,g,b;
            cin>>n>>g>>b;
            if(n<=g)
                {
                    cout<<n<<endl;continue;
                }
            int mid;
            if(n%2!=0)
                mid=n/2+1;
            else
                mid=n/2;
            if(g>=mid)
                cout<<n<<endl;
            else
            {
                int k=mid/g;
                int yu=0;
                int bb=k-1;
                if(mid%g!=0)
                    {    
                        yu=mid%g;
                        bb++;
                    }
                    // 19 7 3 2
                //cout<<k<<" ";
                ll sum=bb*b+k*g+yu;
                //cout<<"bb: "<<bb<<"   k: "<<k<<"  yu:  "<<yu<<endl;
                if(sum<=n)
                    cout<<n<<endl;
                else
                    cout<<sum<<endl;
            }
            
        }
    }

    C:    给一个字符串,相邻字符不同,设计一个键盘,里面的下一个字母是当前字母的相邻位置。如果存在输出YES+布局,否则NO
         解析: vis[] :标记字母是否出现
             a[] :记录相邻情况
             k :指向位置
            初始a[]中间放上字符串的第一个字符,标记vis=1,k指向当前位置,然后for遍历,左右放就可以了。
          放的时候对于当前要放的字符s[i],有两种情况:

            1:之前出现过,那么看a[k]左右,如果a[k-1]==s[i]||a[k+1]==s[i],对应的
          k左移或者右移。如果没满足相等条件,直接输出NO。
            2:之前没出现过,看a[k]左右,哪个空,放哪儿,k对应的移动,并且vis[s[i]]==1。如果左右都不为空那么直接输出NO,因为
          一个字母和三个字母相邻是不能实现键盘的。
            结尾,输出a[]里的字符,再根据vis标记的来输出26个字母中没出现过的字符。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<map>
    using namespace std;
    typedef long long ll;
    typedef pair<char,char>p;
    
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {    
            char s[210];
            int vis[27];
            char a[100];
            memset(a,0,sizeof(a));
            memset(vis,0,sizeof(vis));
            cin>>s;
            int k=27,no=0;
            a[k]=s[0];
            vis[s[0]-'a']=1;
            for(int i=1;i<strlen(s);i++)
            {
                if(vis[s[i]-'a'])
                {
                    if(a[k-1]==s[i])
                    {
                        k--;
                    }
                    else if(a[k+1]==s[i])
                    {
                        k++;
                    }
                    else
                    {
                        no=1;break;
                    }
                }
                else
                {
                    if(!a[k-1])
                    {
                        k--;
                    }
                    else if(!a[k+1])
                    {
                        k++;
                    }
                    else
                    {
                        no=1;break;
                    }
                    a[k]=s[i];
                    vis[s[i]-'a']=1;
                }
            }
            if(no)
                cout<<"NO"<<endl;
            else
            {
                cout<<"YES"<<endl;
                for(int i=0;i<100;i++)
                {
                    if(a[i]>='a'&&a[i]<='z')
                        cout<<a[i];
                }
                for(int i=0;i<26;i++)
                {
                    if(!vis[i])
                        cout<<char(i+'a');
                }
                cout<<endl;
            }
        }
    }
  • 相关阅读:
    [LeetCode] 981. Time Based Key-Value Store
    [LeetCode] 97. Interleaving String
    [LeetCode] 953. Verifying an Alien Dictionary
    代价敏感的学习方法
    深度学习中Dropout原理解析
    梯度下降法的三种形式BGD、SGD以及MBGD
    吉布斯采样(Gibbs Sampling)简介(转)
    Java中next()和hasNext() ? nextLine()和hasNextLine()?区别详解
    红黑树介绍及旋转详解
    Pycharm中实现openCV安装好后简单测试
  • 原文地址:https://www.cnblogs.com/liyexin/p/12306007.html
Copyright © 2020-2023  润新知