喵哈哈村的魔法考试 Round #12 (Div.2) 题解

A

注意答案会超过int,考虑分l,r奇数和偶数来考虑即可。

#include<bits/stdc++.h>
using namespace std;

long long l,r;
int main(){
    while(cin>>l>>r){
        if(l%2==1){
            l++;
        }
        if(r%2==1){
            r--;
        }
        if(l>r){
            cout<<"0"<<endl;
            continue;
        }
        cout<<(r-l+2)/2<<endl;
    }
}

B

如果这个马存活下来,说明前面没有比他跑得快的。

按着坐标排序,记录前缀最大值就好了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
pair<int,int> P[maxn];
int n;
int main(){
    while(scanf("%d",&n)!=EOF){
    for(int i=1;i<=n;i++){
        scanf("%d%d",&P[i].first,&P[i].second);
    }
    int Mx = -1;
    int Ans = 0;
    sort(P+1,P+1+n);
    for(int i=1;i<=n;i++){
        if(Mx>P[i].second){
            continue;
        }
        Mx = max(P[i].second,Mx);
        Ans++;
    }
    cout<<Ans<<endl;
    }
}

C

dp1[i]表示以i结尾的最长上升序列,dp2[i]表示以i开头的最长下降序列。

然后check一下就好了。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e6+7;
int d1[maxn],d2[maxn],a[maxn],n;
int main(){
    while(scanf("%d",&n)!=EOF){
        a[0]=1e9;
        a[n+1]=1e9;
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++){
            if(a[i]>a[i-1])d1[i]=d1[i-1]+1;
            else d1[i]=0;
        }
        for(int i=n;i>=1;i--){
            if(a[i]>a[i+1])d2[i]=d2[i+1]+1;
            else d2[i]=0;
        }
        int Len = 0;
        int ansl=-1,ansr=-1;
        for(int i=1;i<=n;i++){
            if(d1[i]>0&&d2[i]>0){
                if(Len<d1[i]+d2[i]){
                    ansl=i-d1[i]-1;
                    ansr=i+d2[i]-1;
                    Len=d1[i]+d2[i];
                }else if(Len==d1[i]+d2[i]){
                    if(ansl>i-d1[i]-1){
                        ansl=i-d1[i]-1;
                        ansr=i+d2[i]-1;
                    }
                }
            }
        }
        cout<<ansl<<" "<<ansr<<endl;
    }
}

D

模拟题,做起来比较烦。

理清思路去写就好了,其实只要把这个数据[[][]]过了,基本上就过了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
string s;
int d[maxn];
int main(){
    while(cin>>s){
    memset(d,0,sizeof(d));
    for(int i=0;i<s.size();i++){
        if(s[i]=='[')d[i]++;
        else d[i]--;
    }
    int Mx = 1;
    for(int i=1;i<s.size();i++){
        d[i]+=d[i-1];
        Mx=max(Mx,d[i]);
    }
    int len=2*Mx-1,len2=0;
    int flag = 0;
    for(int i=0;i<s.size();i++){
        if(s[i]=='['){
            int Flag = 0;
            if(flag==0){
                Flag = 1;
                flag = 1;
            }else if(flag==1){
                len-=2;
                len2++;
            }
            if(len2){
                for(int j=0;j<len2-1;j++){
                    printf(" ");
                }
                if(Flag==0)
                    printf("|");
                else
                    printf(" ");
            }
            printf("+");
            for(int j=0;j<len;j++)
                printf("-");
            printf("+");
            if(len2){
                if(Flag==0)
                printf("|");
            }
            printf("\n");
        }else{
            int Flag = 0;
            if(i+1<s.size()&&s[i+1]=='['){
                Flag = 1;
            }
            if(flag==1){
                flag = 0;
                len2++;
                if(len2){
                    for(int j=0;j<len2-1;j++){
                        printf(" ");
                    }
                    printf("|");
                }
                for(int j=0;j<len;j++)
                    printf(" ");
                printf("|");
                printf("\n");
                printf("\n");
                if(len2){
                    for(int j=0;j<len2-1;j++){
                        printf(" ");
                    }
                    printf("|");
                }
                for(int j=0;j<len;j++)
                    printf(" ");
                printf("|");
                printf("\n");
                len2--;
            }else{
                len+=2;
                len2--;
            }
            if(len2){
                for(int j=0;j<len2-1;j++){
                    printf(" ");
                }
                if(Flag==0)
                printf("|");
                else
                printf(" ");
            }
            printf("+");
            for(int j=0;j<len;j++)
                printf("-");
            printf("+");
            if(len2){
                if(Flag==0)
                printf("|");
            }
            printf("\n");
        }
    }
    }
    return 0;
}

E

简单博弈论。

相当于在nn的矩阵里铺21的地砖.

所以胜利的结果显然跟n的奇偶有关.

#include<bits/stdc++.h>
using namespace std;

int main(){
    long long n;
    while(cin>>n){
        if(n%2==0){
            cout<<"XiaoMing"<<endl;
        }else{
            cout<<"XiaoHong"<<endl;
        }
    }
}
posted @ 2017-04-09 15:57  qscqesze  阅读(262)  评论(1编辑  收藏  举报