您的位置:首页 > 其它

UVA -1588 Kickdown

2016-07-16 00:45 344 查看
先槽一下,本来选这题是看实验室rank中这道题的通过率挺高,然而小白就是小白,写起来十分痛苦,以后还是乖乖按顺序写吧。

题目大意:两个零件要拼装起来,齿必须对槽,不能齿对齿,但是槽可以对槽。

不过其他人都是这么理解的:第三个零件高3h,前两个零件的高度和不能大于3h。

解题思路:两个串,固定上方的串,移动下方的串,当下方所有的 2 对应的上方都不是 2 时,记录两串无重叠部分的长度;交换两个串,重复上述操作,再次记录交换后的长度;长度若不超过上方的串的长度则记为上方串的长度。对比两个长度,输出最小值。

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int main () {
int i, j ,res1, res2 ;
bool flag ;
char fi[200] , se[200] , cha[200];
while ( scanf( "%s", fi) != EOF) {
scanf( "%s", se);
res1 = 0 ; res2 = 0 ;
while ( res2 == 0) {
for( i = 0 ; i < strlen(fi) ; i++ ) {
flag = 1;
for ( j = 0 ; j < strlen(se) && (j + i) < strlen( fi) ; j++ )
if( se[j] == '2' && fi[i+j] == '2' ) {flag = 0;break;}
if(flag) break;
}
if ( res1 == 0 )
res1 = max( strlen(se) + i , strlen(fi) );
else
res2 = max( strlen(se) + i , strlen(fi) );
strcpy ( cha , fi);
strcpy ( fi , se );
strcpy ( se , cha);
}
cout << min( res1 , res2 ) <<endl;
}
return 0;
}


话说我原来的做法是先算出 second 串有几个 2 ,把每个 2 对应的 first 串的部分都一一对比,非 2 就 record +1 ,然后看看record会不会等于 2 的总数,所以程序多很复杂,华丽地超时了,并且被学长吐槽“完全看不懂我的程序”。

嗯,其实遇到一个不满足条件的直接跳出来,遇到第一个满足条件的输出就行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva ACM