一、题意
A.给你一棵树,你必须找到它最大可能大小的好子树,对于好子树进行了规定。
B.给一个只包含AB的字符串,问有多少个回文子字符串。
C.给两个数,求两个数的差能否用素数的倍数表示。
D.从高度n开始向下跳,一开始有m个板子露出,每次用魔法操作可以将当前板子抽回,下面板子抽出,求必要的最少魔法操作次数。
E.给你一串字母字符串,给一个整数m表示前m个字母,求打出字符串最少要移动手指多少个单位。
F.在1往后,有n个怪物分布在一些位置,每次扔炸弹可以把仍炸弹的当前位置之前的怪物向前炸r个单位,炸弹爆炸位置直接炸死怪物。
二、非水题AC过程
C.大于1的数要么是素数要么是素数的倍数,只要判断a-b是否大于1就好。
D.直接看有多少空就可以,对空进行魔法处理,注意如果紧挨的板子打开了,就要直接跳过下一个板。
F.累加判断,每次打最外面的,然后对紧挨着最外面的怪进行判断,l为怪移动距离每次炮击都加r,用l和第二靠外的怪的位置a[I]进行比较,等于或小于则结束判断。
三.补题情况。
A.由于这是一般比赛的F题目,而其实在比较难,自己基本上写不出,涉及这道题的博客也很少,题意就看不太懂,看了一个AC的代码后依然还是很懵的。
B.本身对于字符之类的题目不熟练,时间也比较急所以没有做出来,实际上这道题还是可以做的那种,现阶段只能多熟练熟练吧,争取ABC难度的题目快点做出来。
E.课下补题的时候,看到了博客上的一个代码,感觉用来解决这样的题目思路挺好的,写法也比较新颖,所以附录在这,以便以后查阅。
#include<bits/stdc++.h>
using namespace std;
int n,m,g[21][21],f[1048576];
char s[100010];
int main(){
scanf("%d%d%s",&n,&m,s+1);
for(int i=2;i<=n;++i)
g[s[i-1]-'a'][s[i]-'a']++,g[s[i]-'a'][s[i-1]-'a']++;
for(int i=1,c;i<(1<<m);++i){
c=0;
f[i]=0x3f3f3f3f;
for(int j=0;j<m;++j)
for(int k=j+1;k<m;++k)
if((i>>j&1)^(i>>k&1))
c+=g[j][k];
for(int j=0;j<m;++j)
if(i>>j&1)
f[i]=min(f[i],f[i^(1<<j)]+c);
}
printf("%d\n",f[(1<<m)-1]);
}
感悟:做题的时候必须排除想当然的做法,比如这次F题思路没问题,但开始的时候我没有设置距离l而是继续用r,利用r=r+r进行累加,结果最后才发现累加的r根本就不是开始给的距离了,导致虽然样例一对了,但一直wrong在2上,以后这点需要警戒。