A.Uniform String
暴力模拟
直接sort相邻配对
题意
有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;
}