Codeforces Round #604 题解

Posted ctyakwf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #604 题解相关的知识,希望对你有一定的参考价值。

A题

本题根据题意模拟能解,不排除更好的做法

技术图片
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int main(){
    int t;
    cin>>t;
    while(t--){
        string s;
        cin>>s;
        int i;
        int flag=1;
        for(i=0;i<s.size()-1;i++){
            if(s[i]==s[i+1]&&s[i]!=?&&s[i+1]!=?){
                cout<<-1<<endl;
                flag=0;
                break;
            }
        }
        if(!flag)
        continue;    
        int a=s.size()-1;
        if(a==0){
            cout<<"a"<<endl;
            continue;
        }
        for(i=0;i<s.size()-1;i++){
            if(s[i]==?&&s[i+1]!=?){
               if(i==0){
                    if(s[i+1]==a)
                    s[i]=b;
                    if(s[i+1]==b)
                    s[i]=c;
                    if(s[i+1]==c)
                    s[i]=a;
               }
               else{
                   if(s[i-1]!=s[i+1])
                   s[i]=(a+b+c-s[i+1]-s[i-1]);
                   else{
                       if(s[i+1]==a)
                    s[i]=b;
                    if(s[i+1]==b)
                    s[i]=c;
                    if(s[i+1]==c)
                    s[i]=a;
                }
               }    
            }
            else if(s[i]==?&&s[i+1]==?){
                if(i==0)
                s[i]=a;
                else{
                    if(s[i-1]==a)
                    s[i]=b;
                    if(s[i-1]==b)
                    s[i]=c;
                    if(s[i-1]==c)
                    s[i]=a;
                }
            }
        }
    
        if(s[a]==?){
            if(s[i-1]==a)
                    s[i]=b;
                    if(s[i-1]==b)
                    s[i]=c;
                    if(s[i-1]==c)
                    s[i]=a;
        }
        cout<<s<<endl;
    }
}
 
View Code

B题

我们能够发现,只需要关注位置关系就能求解本题,所以我们设计一个pos数组记录每个值他的位置在哪

我们可以从1开始遍历到n,然后设计两个变量维护左右边界

技术图片
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int main(){
    int t;
    cin>>t;
    int a[N];
    int pos[N];
    while(t--){
        int n;
        cin>>n;
        int i,j;
        for(i=1;i<=n;i++){
            cin>>a[i];
            pos[a[i]]=i;    
        }
        int l=pos[1];
        int r=pos[1];
        for(i=1;i<=n;i++){
            l=min(pos[i],l);
            r=max(pos[i],r);
            if(r-l+1==i)
            cout<<1;
            else
            cout<<0;
        }
        cout<<endl;
    }
}
View Code

C题

贪心题目,金牌越多越好,然后银牌只需要比金牌大,其他控制铜牌就可以,因为其他情况需要满足更多的条件

我们求取的是最大的奖牌数。

技术图片
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
const int N=2e5+10;
map<int,int> m1;
int main(){
    int t;
    cin>>t;
    while(t--){
        m1.clear();
        int n;
        int i;
        cin>>n;
        int h;
        for(i=1;i<=n;i++){
            cin>>h;
            m1[-h]++;
        }
        if(m1.size()<3){
            cout<<"0 0 0"<<endl;
            continue;
        }
        int g=0;
        int s=0;
        int b=0;
        int flag=0;
        for(auto x:m1){
            if(flag==0){
                if(g+s+b+x.second>n/2)
                 break;
                g=x.second;
                flag++;
            }
            else if(flag==1){
                if(g+s+b+x.second>n/2)
            break;
                s+=x.second;
                if(s>g)
                flag++;
            }
            else{
                if(g+s+b+x.second>n/2)
                break;
                b+=x.second;
            }
        }
        if(g==0||s==0||b==0)
        cout<<"0 0 0"<<endl;
        else if(g>=s||g>=b)
        cout<<"0 0 0"<<endl;
        else
        cout<<g<<" "<<s<<" "<<b<<endl;
    }
}
 
View Code

 

以上是关于Codeforces Round #604 题解的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #604 (Div. 2) 练习A,B题解

Codeforces Round #604 (Div. 2)

Codeforces Round #604 (Div. 2) B. Beautiful Numbers(双指针)

Codeforces Round #604(Div. 2,

Codeforces Round #604 (Div. 2)

Codeforces Round #604 (Div. 2)