Codeforces Global Round 10

这种大场全是神仙打架,向我这种菜菜就是掉分www太难了
神仙打架,百姓遭殃。

A - Omkar and Password

分析可以知道,只要数组元素不是全部相等答案就是1,如何数组元素全部相等答案就是n。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[N];
int n;
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        bool ok=1;
        for(int i=2;i<=n;i++) 
            if(a[i]!=a[1])
            {
    
    
                ok=0;
                break;
            }
        if(ok) cout<<n<<endl;
        else cout<<1<<endl;
    }
    return 0;
}

B - Omkar and Infinity Clock

数学题,稍微写一下就可以找到规律。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010;
ll a[N];
ll n,k;
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>n>>k;
        ll maxa=-2e9,mina=2e9;
        for(int i=1;i<=n;i++) 
        {
    
    
            cin>>a[i];
            maxa=max(maxa,a[i]);
            mina=min(mina,a[i]);
        }
        if(k&1)
        {
    
    
            for(int i=1;i<=n;i++) cout<<maxa-a[i]<<" ";
            cout<<endl;
        }
        else
        {
    
    
            for(int i=1;i<=n;i++) cout<<a[i]-mina<<" ";
            cout<<endl;
        }
        
    }
    return 0;
}

C - Omkar and Waterslide

贪心洛谷原题
题目转化一下相当于添坑。
如果a[i-1]>a[i]说明需要填完a[i-1]-a[i]然后转化为添第i-1个坑即f[i-1]
如果a[i-1]<=a[i]说明填i-1个坑的同时能过顺便填上第i个坑

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010;
ll a[N];
ll n;
ll f[N];
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) f[i]=f[i-1]+max(a[i-1]-a[i],0ll);
        cout<<f[n]<<endl;
    }
    return 0;
}

就做了三个题

D - Omkar and Bed Wars

参考答案正解%%%Orz
首先考虑不合法的情况:
s[i-1]=L并且s[i+1]=L但是s[i]=L也就是你右边的人打你,你左边的人没打你但是你却打你左边的人。
s[i-1]=R并且s[i+1]=R但是s[i]=R也就是你左边的人打你,你右边的人没打你但是你却打你右边的人。
发现就这两种不符合规矩的情况即不能有3个连续相同的字符(Orz我当时乱的一p,这分析太妙了)
因此统计连续相同字符的个数cnt,然后变成不能有3个连续相同的字符。如果连续相同的字符数目是cnt那么要花费cnt/3的代价。
注意如果是一个环,首先找一个点花费1代价破环,最终花费即(cnt-1)/3+1

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010;
ll a[N];
int n;
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        int n;
        cin>>n;
        string s;
        cin>>s;
        int cnt=0;
        while(s.size()&&s[0]==s.back())
        {
    
    
            cnt++;
            s.pop_back();
        }
        if(s.empty())
        {
    
    
            if(cnt<=2) cout<<0<<endl;
            else if(cnt==3) cout<<1<<endl;
            else cout<<(cnt-1)/3+1<<endl;
        }
        else
        {
    
    
            int res=0;
            s.push_back('$');
            for(int i=0;i<s.size()-1;i++)
            {
    
    
                cnt++;
                if(s[i]!=s[i+1])
                {
    
    
                    res+=cnt/3;
                    cnt=0;
                }
            }
            cout<<res<<endl;
        }
    }
    return 0;
}

这题好像dp也能做,可是我不会,回头看看别的大佬咋写的再补一下吧
要加油哦~

猜你喜欢

转载自blog.csdn.net/Fighting_Peter/article/details/108053634