算法竞赛入门经典(第2版)习题3-11 换低挡装置 Kickdown UVa1588

来源:互联网 发布:手机淘宝换回默认皮肤 编辑:程序博客网 时间:2024/06/06 00:48

逻辑如下

1.读入n1/n2,测量各自长度

2.设定容器的最小长度为minlen,minlen=max(n1,n2)

3.依次对比n1/n2,如果发现高度和为4则向右移动n2一格再次对比,最终得到容器长度l1,如果l1小于最小长度minlen,则l1=minlen

4.再次依次对比n1/n2,如果发现高度和为4则向右移动n1一格再次对比,最终得到容器长度l2,如果l2小于最小长度minlen,则l2=minlen

5.所求容器长度为min(l1,l2)

逻辑很简单,但是我最初没有考虑周全,实现上也出过数次错误

最后修正的一个错误是取n1/n2数据长度的时候没有考虑到n1长度等于1的情况,导致n1的长度取成了0.

第5次提交ac,耗时4小时。

1.scanf() 版输入

//#define LOCAL//#define TESTING#include<stdio.h>#include<ctype.h>#include<string.h>#define MAXN 105char n1[MAXN],n2[MAXN];int main(){#ifdef LOCALfreopen("xt3-11.in","r",stdin);#endifmemset(n1,0,sizeof(n1));memset(n2,0,sizeof(n2));while(scanf("%s%s",n1,n2)==2){#ifdef TESTINGint kase1 = 0,kase2 = 0;#endifint len1 = 0,len2 = 0,n = 0, l1=0, l2=0,minlen=0;//读数据,取长度 len1 = strlen(n1);len2 = strlen(n2);for(int i = 0;i<len1; i++) n1[i]=n1[i]-'0';for(int i = 0;i<len2; i++) n2[i]=n2[i]-'0';//读数据,取长度结束if(len1<len2) minlen = len2;else minlen = len1;//计算n2右移情况下的容器最短长度l1 for(int i = 0; i <= len1; i++){bool ok = false;if(i==len1){l1 = len1+len2;#ifdef TESTINGkase1 = 3;#endifbreak;}for(int j = 0; j < len2; j++){if((i+j)<len1){if((n1[i+j]+n2[j])==4) break;else if((j==len2-1)&&((n1[i+j]+n2[j])<4)){l1 = minlen;ok = true;#ifdef TESTINGkase1 = 1;#endifbreak;}}else{l1 = len1+len2-j;#ifdef TESTINGkase1 = 2;printf("l1=%d ",l1); #endifok = true;}if(ok) break;} if(ok) break;}if(l1<minlen) l1 = minlen;//计算n2右移情况下的容器最短长度l1 //计算n1右移情况下的容器最短长度l2for(int i = 0; i <= len2; i++){bool ok = false;if(i==len2){l2 = len1+len2;#ifdef TESTINGkase2 = 3;#endifbreak;}for(int j = 0; j < len1; j++){if((i+j)<len2){if((n2[i+j]+n1[j])==4) break;else if((j==len1-1)&&((n2[i+j]+n1[j])<4)){l2 = minlen;#ifdef TESTINGkase2 = 1;#endifok = true;break;}}else{l2 = len1+len2-j;#ifdef TESTINGkase2 = 2;printf("l2=%d ",l2); #endifok = true;}if(ok) break;} if(ok) break;}if(l2<minlen) l2 = minlen;//计算n1右移情况下的容器最短长度l2结束 //l1/l2取小,if(l1<l2) n = l1;else {n = l2;}//l1/l2取小#ifdef TESTINGprintf("case1=%d case2=%d l1=%d l2=%d\n",kase1,kase2, l1, l2);printf("n1 %d:",len1);for(int i = 0; i < len1; i++) printf("%d", n1[i]);printf("\n");printf("n2 %d:",len2);for(int i = 0; i < len2; i++) printf("%d", n2[i]);printf("\n\n");#endifprintf("%d\n", n);}return 0;}


2.getchar() 版输入

//#define LOCAL//#define TESTING#include<stdio.h>#include<ctype.h>#include<string.h>#define MAXN 105int n1[MAXN],n2[MAXN];int main(){#ifdef LOCALfreopen("xt3-11.in","r",stdin);#endifint temp;while((temp=getchar())!=EOF){#ifdef TESTINGint kase1 = 0,kase2 = 0;printf("%d\n",temp);#endifint len1 = 0,len2 = 0,n = 0, l1=0, l2=0,minlen=0;//读数据,取长度 if(isdigit(temp)) n1[0] = temp - '0';len1 = 1;#ifdef TESTINGprintf("%d\n",n1[0]);#endiffor(int i = 1; i < MAXN; i++){temp = getchar();if(isdigit(temp)){n1[i] = temp- '0';len1 = i+1;}else break;}for(int i = 0; i < MAXN; i++){temp = getchar();if(isdigit(temp)){n2[i] = temp- '0';len2 = i+1;}else break;}//读数据,取长度结束if(len1<len2) minlen = len2;else minlen = len1;//计算n2右移情况下的容器最短长度l1 for(int i = 0; i <= len1; i++){bool ok = false;if(i==len1){l1 = len1+len2;#ifdef TESTINGkase1 = 3;#endifbreak;}for(int j = 0; j < len2; j++){if((i+j)<len1){if((n1[i+j]+n2[j])==4) break;else if((j==len2-1)&&((n1[i+j]+n2[j])<4)){l1 = minlen;ok = true;#ifdef TESTINGkase1 = 1;#endifbreak;}}else{l1 = len1+len2-j;#ifdef TESTINGkase1 = 2;printf("l1=%d ",l1); #endifok = true;}if(ok) break;} if(ok) break;}if(l1<minlen) l1 = minlen;//计算n2右移情况下的容器最短长度l1 //计算n1右移情况下的容器最短长度l2for(int i = 0; i <= len2; i++){bool ok = false;if(i==len2){l2 = len1+len2;#ifdef TESTINGkase2 = 3;#endifbreak;}for(int j = 0; j < len1; j++){if((i+j)<len2){if((n2[i+j]+n1[j])==4) break;else if((j==len1-1)&&((n2[i+j]+n1[j])<4)){l2 = minlen;#ifdef TESTINGkase2 = 1;#endifok = true;break;}}else{l2 = len1+len2-j;#ifdef TESTINGkase2 = 2;printf("l2=%d ",l2); #endifok = true;}if(ok) break;} if(ok) break;}if(l2<minlen) l2 = minlen;//计算n1右移情况下的容器最短长度l2结束 //l1/l2取小if(l1<l2) n = l1;else {n = l2;}//l1/l2取小#ifdef TESTINGprintf("case1=%d case2=%d l1=%d l2=%d\n",kase1,kase2, l1, l2);printf("n1 %d:",len1);for(int i = 0; i < len1; i++) printf("%d", n1[i]);printf("\n");printf("n2 %d:",len2);for(int i = 0; i < len2; i++) printf("%d", n2[i]);printf("\n\n");#endifprintf("%d\n", n);}return 0;}


0 0
原创粉丝点击