题意:
B:CodeForces 1238D:给你一个只包含AB的字符串,问你有多少个回文子字符串。
C:CodeForces 1238A:两数之差是否能分解成一个素数的若干倍。
D:CodeForces 1238C:在h的高度(此处有踏板),character只能跳一层楼或者两层楼,每在一个h高度时,可以按动lever,使得本层踏板收回,下一层的踏板会改变状态(缩进去会伸进去,伸进去的会出来)。如果跳超过两层,可以用魔法使一层改变状态。求最少要用多少次。
E:CodeForces 1238E:一串字母字符串,给一个整数m表示前m个字母,求打出字符串最少要移动手指多少个单位。假设要打abca 而m序列为abc。m的顺序可以改变。
F:CodeForces 1238B:从1往后,有n个怪物分布在一些位置,每次扔炸弹可以把仍炸弹的当前位置之前的怪物向前炸r个单位,炸弹爆炸位置直接炸死怪物。
补题:
B:思路:逆向思维。题目要求含有长度大于1的回文串即为好的字符串,而且字符串中只有A,B两个字母,所以只有AAAAB或者BAAAA或者ABBBB或者BBBBA这种形式字符串是非好的,其他的字串都是好的。所以求出这些字符串的数量即可。
代码:
#include <bits/stdc++.h>
using namespace std;
char s[1000010];
int main()
{
long long n,cnt=0,last=0,ans=0;
cin>>n;
cin>>s;
for(int i=0;i<n;i++)
{
if(i&&s[i]!=s[i-1])
{
ans+=cnt;
cnt=0;
last=i;
}
else if(last)
{
ans++;
}
cnt++;
}
long long sum=n*(n-1)/2;
cout<<sum-ans<<endl;
}
D:思路:1.如果x-2高度处有挡板,那么我们在x处按动开关,x和x-1高度处的挡板都收起,小人恰好落在x-2高度处的挡板。
2.如果x-2高度处没有挡板,所以我们用魔法,让x-1高度处的挡板收起来。
注:人在的位置为a[i]-1;
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[200010],q;
int main()
{
cin>>q;
while(q--)
{
int h,n;
cin>>h>>n;
for(int i=0;i<n;i++)
a[i]=0;
for(int i=0; i<n; i++)
cin>>a[i];
a[n]=0;
int ans=0;
for(int i=1; i<n; i++)
{///判断i+1和i是否相邻
if(a[i+1]+1==a[i])
i++;///相邻 就跳到i+2
else
ans++;///不相邻 就用掉一个magic 跳到i+1;
}
cout<<ans<<endl;
}
}
F:思路:先排序,再二分。判断左边数第n−mid个怪物能否在mid次导弹下被炸到陷阱里。
代码:
#include <bits/stdc++.h>
using namespace std;
int wz[100010],v[100010]={0},t,n,r,tip,tmp,ans;
int main()
{
tip=1;
ans=0;
cin>>t;
while(t--)
{
tip=1;
ans=0;
cin>>n>>r;
for(int i=1; i<=n; i++)
{
cin>>tmp;
if(v[tmp]==0)
{
v[tmp]=1;
wz[tip]=tmp;
tip++;
}
}
sort(wz+1,wz+tip);
tip-=1;
for(int i=1; i<=tip; i++)
if(wz[tip-i]<=r*i)
{
ans=i;
break;
}
cout<<ans<<endl;
for(int i=1;i<=n;i++)
v[wz[i]]=0;
}
}
感受:D题题目理解错了,以为开关管的是全部,对着样例模拟了半天。F题,memset函数超时了,说实话,调的时候有点懵,搞得我D题都不敢用memset初始化数组了。剩下的时间都磕在B上了,这题也是花太多时间在题目上,good string的定义在第一行,没注意,虽然看懂之和也还是没弄出来,哎。