CF527

A.Uniform String

 

暴力模拟

B.Teams Forming

直接sort相邻配对

C.Prefixes and Suffixes

题意

有2*(n-1)个字符串,分别为一个字符串的前缀或后缀,分别判断是前缀还是后缀。

思路

先将字符串按长度从大到小排序。

通过n-2位的字符串判断n-1位的字符串是前缀或后缀。

最后逐位判断即可。

D1.Great Vova Wall (Version 1)

题意

有一堵墙,共n个部分,每部分有一个高度。在墙上添加1X2/2X1的砖块,能否使墙每部分高度相同。

思路

若两部分墙高度相同(即差位偶数),则必然可通过加砖块达到任何高度,即可删除该两部分砖块。

判断剩下的部分是否小于等于1即可。

代码

#include<bits/stdc++.h>
using namespace std;
stack<int> stk;
int n,h;
int main(){
    scanf("%d",&n);
    scanf("%d",&h);
    stk.push(h);
    for(int i=2;i<=n;i++){
        scanf("%d",&h);
        if(stk.size()&&(h-stk.top())%2==0)stk.pop();
            else stk.push(h);
    }
    if(stk.size()<=1) printf("YES\n");else printf("NO\n");
    return 0;
}

D2.Great Vova Wall (Version 2)

题意

有一堵墙,共n个部分,每部分有一个高度。在墙上添加2X1(横)的砖块,能否使墙每部分高度相同。

思路

若两部分墙高度相同,则必然可通过加砖块达到任何高度,即可删除该两部分砖块。

所以123321不满足题意的,而321123满足题意。

所以,满足题意的墙应该像上述一样几个“凹”的高度的组合加上最多一列高度为h的墙。

代码

#include<bits/stdc++.h>
using namespace std;
stack<int>s;
int n,x,mx=-1;
int main(){
    scanf("%d",&n);
    for(int i=1; i<=n; i++){
        scanf("%d",&x);
        mx=max(mx,x);
        if(!s.empty()){
            if(s.top()<x){
                printf("NO");
                return 0;
            }
            if(s.top()==x) s.pop();
                else if(s.top()>x) s.push(x);
        }
        else s.push(x);
    }
    if(s.size()>1){
        printf("NO");
        return 0;
    }else if(s.size() == 1)
    if(s.top()<mx){
        printf("NO");
        return 0; 
    }
    printf("YES");
    return 0;
}

 

 

猜你喜欢

转载自www.cnblogs.com/Liah/p/10159974.html