Uva 1588 Kickdown

it2024-02-23  71

“我真的是阅读理解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; }
最新回复(0)