题目大意
给两个长度分别为n1,n2(n1,n2<=100),且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器,问能够容纳他们的最短容器长度。
题目地址: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;
}