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;
        }
    }
}
原文地址:https://www.cnblogs.com/liyexin/p/12306007.html