第八节训练课总结

最后更新于 2025-08-02 21:43:33
作者
分类 个人记录

题目:P12173 [蓝桥杯 2025 省 Python B] 最多次数

错误原因

没理解题目,将i每次设为加3,但是当这个不成立时,应该要尝试下一个字符

思路

题目要我们输出字符串中小蓝喜欢的单词数

那这道题要用一个变量来记录共有几个小蓝喜欢的单词数,所以我们首先先遍历字符串s但是这里i每次只加1,因为这个默认的是没找的情况,后面改一下就可以了。

那么在循环内,我们只要先判断是否为小蓝喜欢的单词,如果是的话不光小蓝喜欢的单词数要加1,同时我们已经分割完了,所以下一个就不是从i+1开始了,是从i+3开始,所以i就加上2(算上i原本加的,所以是加3-1)

最终输出cnt

重难点

1.分割完后如何从当前点跳到下一个点

2.如何截取单词

代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	int cnt=0;
	cin>>s;
	for(int i=0;i<s.size()-3+1;i++)
	{
		if(s.substr(i,3)=="lqb" || s.substr(i,3)=="lbq" || s.substr(i,3)=="qlb" || s.substr(i,3)=="qbl" || s.substr(i,3)=="blq" || s.substr(i,3)=="bql")//用substr函数来截取单词从而判断是否为小蓝喜欢的单词
		{
			cnt++;
            i+=2;//已经分割完了,所以下一个应该是i+3开始了
		}
	}
	cout<<cnt;//输出
	return 0;
}

题目:B4006 [GESP202406 四级] 宝箱

错误原因

思路不对,我的思路是从大到小排序后只要能装就一直装,但是虽然将最大的给装下了,但是不一定就最大价值

思路

题目要我们输出的是最大价值,注意不是宝箱数量

其实这道题可以用前缀和的思路来完成,在输入a[i]并排序后,我们就可以求前缀和了

接下来我们再用双重循环来枚举a[i]以及a[j],当两个数满足差小于等于k我们就可以打擂台了(这里要注意的一点是只要满足条件,整个这之间的宝箱都可以拿走了,因为它们肯定满足差小于等于k)

最终输出我们能取走的宝箱的总价值的最大值

重难点

能考虑到当a[i]与a[j]满足条件,整个这之间的宝箱都可以拿走了这一点

代码

#include <bits/stdc++.h>
using namespace std;

int a[1005],sum[1005];

int main()
{
	int n,k;
	int maxn=0;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+n+1);//从小到大排序
    for(int i=1;i<=n;i++)
    {
        sum[i]=sum[i-1]+a[i];//必须在这里操作,不然顺序就会乱,因为中途排了序
    }
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j<=n;j++)
        {
            if(a[j]-a[i]<=k)//必须满足条件
            {
                maxn=max(maxn,sum[j]-sum[i-1]);//打擂台
            }
        }
	}
	cout<<maxn;
	return 0;
}