【每日一练】UVa1588 换抵挡装置-Kickdown

点击跳转题目链接
写题解是为了记录自己的成长和思考该题的方式,同时锻炼自己的能力,注释我会详细写出自己哪里纠结了很久的地方,以及相关的一些知识点,有错误还请各位大佬指出。

    本题关键:高度限制3h,要对应缝隙,用相加<3解决,有顺序限制,需要来回讨论。
    方法:找出大小串,以大的在上,小的从左蹭到右,之后顺序同时反转再蹭一遍。

这是我做题时画的一个简单流程图:这是我做题时画的一个简单流程图
以下是AC代码:
下面展示一些 内联代码片

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int minl(string mins, string maxs)
{
	int l1=maxs.size(), l2=mins.size();//一开始我用strlen然后报错了,只能用于char型,string型要用size
		int i=0,j=0;
		for(i=0; i<l1; i++)
		{
		
			for(j=0; j<min(l2, l1-i); j++)//用min(l2,l1-i)避免超出内存
			{
				if(mins[j] + maxs[j+i] - 96 > 3) break;//这里一开始我用mins[j]+maxs[j+i]>'3'表示,后来实在吐血了想到可能字符串直接相加不能表示成ASCII比较大小,查了资料后发现可以这样表示
			}
			if(j == min(l2, l1-i)) break;
		}
	int l;
	l2 + i < l1 ? l=l1 : l=l2+i;//判断是否超出最大字符串的边界再确定长度
	return l;
}
int main(int argc, char** argv) {
	string s1,s2,mins,maxs;
	while(cin>>s1>>s2)
	{
		if(s1.size() <= s2.size()) mins=s1, maxs=s2;
		else mins=s2, maxs=s1;
		int a1=minl(mins, maxs);
		//两边都要同时反转,具体原因可思考一下
		reverse(maxs.begin(), maxs.end());//reverse函数将字符串顺序反转,头文件是algorithm
		reverse(mins.begin(), mins.end());
		int a2=minl(mins, maxs);
		cout<<min(a1, a2)<<endl;
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值