暑假嗨七训练总结

本文解析了六道算法竞赛题目,包括树的最大好子树、回文子字符串计数、素数倍数差值判断、魔法跳跃板游戏、字母键盘移动最小单位计算及怪物轰炸策略。分享了AC过程中的关键洞察,如直接判断素数倍数差值和利用空板进行魔法操作等技巧,并附上了补题心得和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题意

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上,以后这点需要警戒。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值