“我真的是阅读理解0分。这道题目看了一个多小时还是不明白什么意思。感谢Code Paradise的那位软件工程师…要不然我真的不明白。”
大体题意:有两种平面齿轮:在上面的叫做driven gear。在底部的叫做master gear。(后来发现我连齿轮的情况也理解错了,题目意思是牙齿在底部的是master gear。牙齿在顶部的是driven gear…额真的这样???)
长度为n的一段含有n个单元。每个单元(每个单元的宽度是一样的!!!)要么高为h要么高为2h。高度为h的凹进去,2h的凸出来。
现在有一块宽度为3h,长度足够的金属 (因为两个齿轮咬合之后高度为2h+h=3h),
用于切割,给出两张齿轮的情况,求金属所需要的最短长度。
以下为accpet代码:
要注意使用char类型数组而不是int类型数组
要考虑到两个齿轮完全不能重叠的情况
/*
有两种移动情况:
固定任意一个,另外一个向左移动,记录最短长度l1
向右移动,记录最短长度L2。
取L1和L2最小者
这里选择固定A移动B,然后固定B移动A。
如何实现移动,移动A x步,即比较A[0]和B[x],A[i]和B[i+x]
如何判断满足重叠条件?只要A[i]+B[i+x]<=3即可
*/
#include<stdio.h>
#include<string.h>
int main(){
char s[105];//不能使用int s[105];
char t[105];
while(scanf("%s%s",s,t) != EOF){
int slen = strlen(s);
int tlen = strlen(t);
int len1 = 0, len2 = 0;
//向右移动t
int flag=0;
for(int i=0;i<slen;i++){
int j=0;
for(;j<tlen && (i+j)<slen;j++){
int a=t[j] - '0';
int b=s[i+j] - '0';
if(a+b>3){
flag = 0;
break;
}
else{
flag = 1;
}
}
if(flag == 1){
if(tlen>(slen-i)){
len1 = i+tlen;
}
else
len1 = slen;
break;
}
}
//如果两者完全没有重叠的地方
if(flag==0){
len1 = slen + tlen;
}
//移动s
flag=0;
for(int i=0;i<tlen;i++){
int j=0;
for(;j<slen && (i+j)<tlen;j++){
int a=s[j] - '0';
int b=t[i+j] - '0';
if(a+b>3){
flag = 0;
break;
}
else{
flag = 1;
}
}
if(flag == 1){
if(slen>(tlen-i)){
len2 = i+slen;
}
else
len2 = tlen;
break;
}
}
if(flag == 0)
len2 = slen + tlen;
if(len1>len2)
printf("%d\n",len2);
else
printf("%d\n",len1);
}
return 0;
}