UVA 1588 Kickdown & ACM/ICPC NEERC 2006 解题报告

题目大意

        给两个长度分别为n1,n2(n1,n2<=100),且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器,问能够容纳他们的最短容器长度。

         \epsfbox{p3712a.eps}

              


题目地址:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51983



Sample Input  &  Sample Output  


          可以输入上述题目地址见详情(真的不是我懒)。



解题思路


            这道题原题的description很长,而且还是英文的,但是翻译之后我们需要了解的也就是上面短短几十个字而已。所以新手朋友不要被英文吓到。

            然后这道题我一开始思路也很简单,就是用两个for循环遍历一下,从左往右找出两根长条重合的部分,再用两根长条的和减去重合的部分,然后果然WA了。

            于是我遇上了坑点一: 在sample input 的里面第一根长条的长度是大于等于第二根长条的长度的,必须考虑这个情况。

            当然如果你在程序前面再加一个判断语句if的话,你会发现,你的程序还是WA。

            这就是这道题的坑点二:

                    类似     12212   2221  这个input的话,你从左往右一个个判断的话,重合部分的0,得出的答案是9。 但是从右往左的话,重合部分是2,答案是7。

            所以这道题最大的尿性就在于其检验数据按不同方向可以有两个不同答案,我们还要判断一下哪个更小,输出较小的那个答案才可以AC。

            当然觉得以上废话太长的话就直接看下面的代码吧  _(:_」∠)_

           

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char a[105],b[105];
int main(){
	while(~scanf("%s",a)){
		scanf("%s",b);
		int A=strlen(a);
		int B=strlen(b);
		
		
		int i=0,j=0;
		for(i=0;i<A;++i){
			for(j=i;j<B+i&&j<A;++j){
				if(((a[j]-'0')+(b[j-i]-'0'))>3)break;
			}
			if(j>=B+i||j>=A)break;
		}
		int k1,k2;
		if(i<A)	k1=A+B-j+i;
		else k1=A+B;
		
			
		
		for(i=0;i<B;++i){
			for(j=i;j<A+i&&j<B;++j){
				if(((b[j]-'0')+(a[j-i]-'0'))>3)break;
			}
			if(j>=A+i||j>=B)break;
		}
		
		if(i<B)	k2=A+B-j+i;
		else k2=A+B;	
		int ans;
		ans=k1<k2?k1 :k2;	
		cout<<ans<<endl;
		
	}
	
	
	return 0;
}






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值