Uva1588(模拟)
Posted Western_Trail
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uva1588(模拟)相关的知识,希望对你有一定的参考价值。
Time limit: 3.000 seconds
题意:
有上下两条长条,长条上有很多槽,其中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;
}
以上是关于Uva1588(模拟)的主要内容,如果未能解决你的问题,请参考以下文章