Codeforces Round #604 (Div. 2)

A题:https://codeforces.com/contest/1265/problem/A

题意:这道题的话,是给你n串字符串,每串字符串都是由"a","b","c","?"组成。然后告诉你每个相邻的字母如果是不同的,那么这个字符串便是好串。让你把每串字符串中的"?"改成"a","b","c"中的任意一个。问你这个字符串是不是好串。如果是的话,输出字符串;如果不是的话,输出-1。

思路:思路的话,就是把"?"替换成"a","b","c";很简单,看代码就知道了。

AC代码:

#include <bits/stdc++.h>
typedef long long ll;
const int maxx=1010;
const int inf=0x3f3f3f3f;
using namespace std;
string s;
string x="abc";
void solve()
{
     cin>>s;
        for(int i=0; i<s.size(); i++)
        {
            for(int j=0; j<3; j++)
            {
                if(s[i]=='?')
                {
                    if(i>0 && s[i-1]==x[j])
                        continue;
                    if(i+1<s.size() && s[i+1]==x[j])
                        continue;
                    s[i]=x[j];
                }
            }
        }
        for(int i=0; i<s.size(); i++)
        {
            if(s[i]==s[i+1])
            {
                cout<<"-1"<<endl;
                return ;
            }
        }
        cout<<s<<endl;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
       solve();
    }
    return 0;
}

B题:https://codeforces.com/contest/1265/problem/B

题意:这道题的话,题意就是给你一串序列,问你当m从1开始增大的时候能不能实现有一个区间满足是从1~m的每一个数,如果满足的话,就输出1,不满足就输出0。

思路:思路的话就是设立一个l和一个r作为序列的左右边界,然后,因为序列的第一个数总满足,所以第一个就先输出一个"1"。
然后再一一进行遍历,若能找到就输出"1",找不到就输出"0"。

AC代码:

#include <bits/stdc++.h>
typedef long long ll;
const int maxx=200010;
const int inf=0x3f3f3f3f;
using namespace std;
int a[maxx],b[maxx];
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            b[a[i]]=i;
        }
        int l=b[1],r=b[1];
        cout<<"1";
        for(int i=2;i<=n;i++)
        {
            l=min(l,b[i]);
            r=max(r,b[i]);
            if(r-l+1==i)
                cout<<"1";
            else
                cout<<"0";
        }
        cout<<endl;
    }
    return 0;
}

C题:https://codeforces.com/contest/1265/problem/C

扫描二维码关注公众号,回复: 8682676 查看本文章

题意:这道题的话,题意是进行了一场icpc的比赛,然后要你进行颁奖。颁奖的时候要注意金牌的题数要严格大于银牌的题数;银牌的题数要严格大于铜牌的题数;铜牌的题数要严格大于未获奖的题数。同时还要注意,金银铜牌数不能超过比赛人数的一半。

思路:思路的话,就是贪心的思想,因为奖牌总数不能超过一般人数,所以我们可以让金牌和银牌的人数尽可能的少,
然后剩下的都是铜牌,这样就可以满足题里的要求。

AC代码:

#include <bits/stdc++.h>
const int maxn=400010;
const int inf=0x3f3f3f3f;
using namespace std;
int a[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=1; i<=n; i++)
            cin>>a[i];
        int g=0,s=0,d=0,x=0;
        for(int i=1; i<=n/2; i++)
        {
            if(a[i]!=a[i+1])
            {
                x=i;
                break;
            }
        }
        g=x;
        int k=a[g+1];
        for(int i=x+2; i<=n/2; i++)
        {
            if(a[i]!=k && i-g-1>g)
            {
                s=i-g-1;
                x=i;
                break;
            }
            else if(a[i]!=k && i-g-1<=g)
            {
                k=a[i];
            }
        }
        for(int i=n/2+1; i>=x; i--)
        {
            if(a[i]!=a[i-1])
            {
                d=i-x;
                break;
            }
        }
        if(g>=s || g>=d || g+s+d>n/2)
            cout<<"0 0 0"<<endl;
        else
            cout<<g<<" "<<s<<" "<<d<<endl;
    }
    return 0;
}
发布了204 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43846139/article/details/103499650