首页 > 其他分享 >Educational Codeforces Round 119 (Rated for Div. 2)

Educational Codeforces Round 119 (Rated for Div. 2)

时间:2023-01-14 22:23:20浏览次数:52  
标签:Educational Rated int Codeforces mx maxn solve include 我们

Educational Codeforces Round 119 (Rated for Div. 2)

我真是越来越菜了,现在竟然连a都做不出来了,o(╥﹏╥)o

A

A

这个题是对于每一个ai和ai+1,(an和a1)都有一个判断,判断这两个是否相等,N代表着不相同,E代表相同,问我们是否可以找出这样一个数组

我就直接讲解法了吧

我们可以把这一串看成一个环,对于只有一个N的情况,那么一定是不符合条件的

#include <iostream>
#include <string>
using namespace std;
const int maxn=2e5+10;
int t;
string s;
void solve()
{
    cin>>s;
    int cnt=0;
    for (int i=0;i<s.size();i++)
    {
        if (s[i]=='N') cnt++;
    }
    if (cnt==1)
    {
        cout<<"NO\n";
    }
    else 
    {
        cout<<"YES\n";
    }
    return ;
}
int main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

C

C

这个题目是给予我们一个串,里面有a,是固定的,还有一种字符是*,这种事可以变化的,我们可以变成0到k个b,我们需要找出第x个小的字符

这一个我一开始看到代码,还以为是逆康拓展开,仔细一看,还是不同的

但是还是有一些操作也和逆康拓相似的

对于第一小的,是所有的*都变成0个b

我们要想增加到1,那么我们需要把加上一个b(在最后),要增加到x,如果这一个*不够(最多只可以变成k个b),那么我们可以往前找,再把此时需要的次序还要更新(到了第二个 * 号,我们的次序增加了(k+1)个),一直往前找,对于这一个 * 号,需要变成多少个b,就是此时还需要往前找的数量sum%(k+1),对于k是有多少个连续的 * 号

其实这一个操作过程就好像把x变成是一个k+1进制的数(这个k是连续cnt个 * 号,k=cnt*k,对于每一位,其中的进制中的每一个k有可能是不同的),仔细想想,好像也符合题意。

比如一个二级制,每一位都只能选0或者是1

最小的就是00,第二小的是01,第三小的是10,第四小的是11

就觉得蛮妙的

#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <cstring>
using namespace std;
#define int long long 
const int maxn=2e3+10;
int n,k,t,x;
string s;
int idx,idx2;
int a[maxn],b[maxn];
void calc(int n,int k)
{
    for (int i=n;i>=0;i--)
    {
        b[i]=k%(a[i]+1);//就算是0也不怕,索性就直接往前遍历了
        k/=(a[i]+1);
    }
    return ;
}
void solve()
{
    cin>>n>>k>>x;
    cin>>s;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    idx=0,idx2=0;
    for (int i=0;i<n;i++)
    {
        if (s[i]=='a')
        {
            if (a[idx])
            {
                idx++;
            }
        }
        else 
        {
            a[idx]+=k;
        }
    }
    calc(idx,x-1);
    for (int i=0;i<n;i++)
    {
        if (s[i]=='a')
        {
            if (i&&s[i-1]=='*')
            {
                for (int j=0;j<b[idx2];j++)
                {
                    cout<<'b';
                }
                idx2++;
            }
            cout<<'a';
        }
    }
    if (idx2<=idx)
    {
        while (idx2<=idx)
        {
            for (int j=0;j<b[idx2];j++)
            {
                cout<<'b';
            }
            idx2++;
        }
    }
    cout<<'\n';
    return ;
}
signed main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

D

D

这个大意是有n个数,我们需要用1,2,3这三个数需要总共多少个,可以对于所有的数都可以满足

那么我们可以贪心的来看,我们要尽量的多用3

对于那些必须用的1或者2还有些判断,具体看代码吧

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=2e5+10;
int n,a[maxn],t;
void solve()
{
    cin>>n;
    int t1=0,t2=0,t3=0;
    int mx=0,mi=1e9;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
        mx=max(mx,a[i]);
        mi=min(mi,a[i]);
        if (a[i]%3==0)
        {
            t3=max(t3,a[i]);
        }
        else if (a[i]%3==1)
        {
            t1=1;
        }
        else 
        {
            t2=1;
        }
    }
    int ans=0;
    if (mx%3==0)//如果最大的数%3==0,那么对于需要2的数,我们可以多出一个2,对于还有需要1的数我们还可以多加一个1,对于既有1,又有2的情况,我们把最大的那一个的需要的3换成2和1,那么我们就只多出一个了
    {
        ans=mx/3+(t1|t2);
    }
    else if (mx%3==2)
    {
        ans=mx/3+1+t1;//对于这一类,2是必须的,如果有需要1,就加一
    }
    else //对于多出了一个1,对于最后4个,我们有两种选择,但是不管怎样,都会加一
        // 1 3
        // 2 2
        //如果我们需要2 ,那么我们就只能是2 2了,
        //如果我们还有一个1,我们就必须还要加一(对于余数为1的,我们也看用2 2的方式转换
        //如果第二小的数%3==0,那么我们就必须要t3/3个3,那么我们就只可以用1 3的方式来了,那么我们只能在多出一个1了
    {
        ans=mx/3+1+(t2&(mi==1||t3+1==mx));
    }
    cout<<ans<<'\n';
    return ;
}
signed main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

标签:Educational,Rated,int,Codeforces,mx,maxn,solve,include,我们
From: https://www.cnblogs.com/righting/p/17052685.html

相关文章