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;
}
posted @ 2018-04-24 18:56  Western_Trail  阅读(145)  评论(0编辑  收藏  举报