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

 

posted @ 2020-02-02 12:04  朝暮不思  阅读(143)  评论(0编辑  收藏  举报