Uva1588(模拟)

Time limit: 3.000 seconds

题目连接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=830&page=show_problem&problem=4463

题意:

有上下两条长条,长条上有很多槽,其中2代表凸槽,1代表凹槽,求他们组合在一起后的的最小的长度。

分析:

其实关键就是要找到长条凹凸槽配对的个数。配对可以转化为字符串中每个槽的值相加<=3,一旦出现一个位置不配对,则给下面长条一个偏移量,让上面的长条重新从起始位置0与下面长条偏移位置开始比较。完成上述步骤得到一个容量长度为count1=m+n-peidui再将上述两个长条调换位置,再进行比较,再得到一个容量长度为count2 = m+n-peidui,count1与count2中的最小值即为容量的长度。

代码如下

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main(){
    char low[110],up[110];      //定义两个长条
    while((scanf("%s%s",low,up))!=EOF){
        int peidui;         //槽的配对个数 
        int i,j,pianyi;     //循环变量与偏移量
        int m = strlen(low);
        int n = strlen(up);
        
        i = j = pianyi = peidui = 0;
        for(;i < m&&j < n;){
            if(low[i] + up[j] - 96 <= 3){       //若配对,则继续比较 
                i++,j++,peidui++;
            }else{
                peidui = 0;         //一个槽不配对则配对归0 
                pianyi++;
                i = pianyi;     //下面的长条从偏移位置开始比较 
                j = 0;      //上面的长条重新从起始位置比较 
            }
        }
        
        int len1 = m + n - peidui;
        i = j = pianyi = peidui = 0;
        
        //调换长条进行第二次比较
        for(;i < n&&j < m;){
            if(up[i] + low[j] - 96 <= 3){
                i++,j++,peidui++;
            }else{
                peidui = 0;
                pianyi++;
                i = pianyi;     
                j = 0;
            }
        }
        
        int len2 = m + n - peidui;
        printf("%d\n",len1<len2?len1:len2); 
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Western-Trail/p/8932883.html