AB水题
C.
题意:好 数 组,给n个数的数组,让你删除前K个数使得后面的数有尖形结构,就是先增后减,或者只有增或减。
思路:题其实不难,就是看懂题意可真是费劲。让这题变得最简单的点就是它要求删除前K个数,这样我们就可以从后往前进行检查,直到它不符合尖形结构。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[200005];
int main()
{
int t,i,j;
cin>>t;
while(t--){
int n,k=0,kk;
memset(a,0,sizeof(a));
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
if(a[n]>a[n-1])
{
for(i=n;i>=2;i--)
if(a[i-1]>a[i]){
k=i-1;
break;
}
}
else{
for(i=n-1;i>=1;i--)
if(a[i]>a[i-1])
{
kk=i;
break;
}
for(i=kk;i>=2;i--)
if(a[i-1]>a[i])
{
k=i-1;
break;
}
}
cout<<k<<endl;
}
}
D.
题意:a的好 子 符 串,就是字符串前一半或后一半都是a,然后另一半是b好字符串,b好字符串就是前一半或后一半都是b,另一半是c好字符串。
思路:比赛时没看懂题意,实在是不太好明白,后来看了很多别人的解释结合例子又理解了一下才明白的,那么这题也不是很难,只要把递归做好,每次递归,找前后端点和进行到哪个字母了,用三个rt ,l ,r 就能表示好
int dfs(int rt,int l,int r){
if(l==r)return str[l]!='a'+rt-1;
int x,y,z = 0,f = 0;
int m = l + r >> 1;
for(int i = l;i <= m;++i){
if(str[i]!='a'+rt-1)f++;
}
for(int i = m+1;i <= r;++i){
if(str[i]!='a'+rt-1)z++;
}
x = dfs(rt+1,l,m);
y = dfs(rt+1,m+1,r);
return min(x+z,y+f);
}
E后面有点看不懂题解,待补。
本文解析了两道ACM竞赛题目,包括好数组和a的好子符串问题,详细阐述了解题思路与代码实现,适合算法学习者深入理解。
2962

被折叠的 条评论
为什么被折叠?



