UVA -1588 Kickdown

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

题目大意:两个零件要拼装起来,齿必须对槽,不能齿对齿,但是槽可以对槽。
不过其他人都是这么理解的:第三个零件高3h,前两个零件的高度和不能大于3h。

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

#include
#include
#include
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 ) <return 0;
}

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

你可能感兴趣的:(acm训练)