zoukankan      html  css  js  c++  java
  • 喵哈哈村的魔法考试 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("
    ");
            }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("
    ");
                    printf("
    ");
                    if(len2){
                        for(int j=0;j<len2-1;j++){
                            printf(" ");
                        }
                        printf("|");
                    }
                    for(int j=0;j<len;j++)
                        printf(" ");
                    printf("|");
                    printf("
    ");
                    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("
    ");
            }
        }
        }
        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;
            }
        }
    }
  • 相关阅读:
    [转]android刷新后R.java不见了
    adb常用指令
    [转]Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
    effective c/C++
    七种布局显示方式效果及实现
    修改Tabhost样式和字体大小的方法
    [转]android中SoundRecorder
    java中的IO整理
    在xp下面下载Android源代码
    linux网络 (二):无线网络操作
  • 原文地址:https://www.cnblogs.com/qscqesze/p/6685004.html
Copyright © 2011-2022 走看看