USACO 2021 January Contest, Bronze. Problem 1. Uddered but not Herd

题目描述

一个鲜为人知的事实是,奶牛拥有自己的文字:「牛文」。牛文由 26 个字母 'a' 到 'z' 组成,但是当奶牛说牛文时,可能与我们所熟悉的 'abcdefghijklmnopqrstuvwxyz' 不同,她会按某种特定的顺序排列字母。

为了打发时间,奶牛 Bessie 在反复哼唱牛文字母歌,而 Farmer John 好奇她唱了多少遍。

给定一个小写字母组成的字符串,为 Farmer John 听到 Bessie 唱的字母,计算 Bessie 至少唱了几遍完整的牛文字母歌,使得 Farmer John 能够听到给定的字符串。Farmer John 并不始终注意 Bessie 所唱的内容,所以他可能会漏听 Bessie 唱过的一些字母。给定的字符串仅包含他记得他所听到的字母。

输入格式(从终端/标准输入读入):

输入的第一行包含 26 个小写字母 'a' 到 'z' 的牛文字母表顺序。下一行包含一个小写字母组成的字符串,为 Farmer John 听到 Bessie 唱的字母。字符串的长度不小于 11 且不大于 10001000。

输出格式(输出至终端/标准输出):

输出 Bessie 所唱的完整的牛文字母歌的最小次数。

输入样例:

abcdefghijklmnopqrstuvwxyz
mood

输出样例:

3

样例解释:

在这个样例中,牛文字母表与日常的字母表的排列一致。

Bessie 至少唱了三遍牛文字母歌。有可能 Bessie 只唱了三遍牛文字母歌,而 Farmer John 听到了以下被标记为大写的字母。

abcdefghijklMnOpqrstuvwxyz
abcdefghijklmnOpqrstuvwxyz
abcDefghijklmnopqrstuvwxyz

测试点性质:

  • 测试点 2-5 中,牛文字母表与日常的字母表相同。
  • 测试点 6-10 没有额外限制。

本题主要考察知识点,字符串、遍历、枚举、周期、取模%。

本题难度:入门题,语法熟练,有一定算法基础。

思路:

        固定当前第二个字符串,从头开始去和第一个输入的字符串中去比对,比对过程中注意两点:

1. 找到相同的字符之后,对于第一个字符串str1应当立刻退出,并且从下一个字符开始继续与第二个字符串str2中的下一个字符比对;

2. 如果没有找到相同的字符,则对于第一个字符串str1应当继续向后遍历,但是一定会面临字符串会遍历到结束的情况,所以考虑到增加字符串长度可能会越界,所以采用%方法搞定类似的周期行为。

接下来是一份枚举法的题解

#include <iostream> 
#include <cstdio>
#include <cmath>
using namespace std;
int main(){
	//定义两个字符串 
	string str1, str2;//奶牛哼唱的歌     Bessie听到的歌 
	cin >> str1 >> str2;
	int len1 = str1.length(), len2 = str2.length();
	//固定str2中的一个字符,与str1中字符比对 
	int j = 0;//用一个全局变量j在str1字符串中遍历 
	for (int i = 0; i < len2; i++){
		//j始终++ 
		for (; ; j++){
			//如果当前str1中字符为str2中的某个字符,则可退出去检验str2中的下一个字符 
			if (str1[j % len1] == str2[i]){
				j++;
                //因为退出就不会j++了,保证下一个str1的字符对应的是下一个str2的字符,不重复判断 
				break;
			}
		}
	}
	//j为为了找到str2中字符一共遍历了多少个str1中的字符数量 
	cout << ceil((double)j / len1);
	return 0;
}

做题感受:

USACO的题目的确是考察的很全面,测试点出的让人很有思考性,能够循着测试点搞定基础思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值