本文共 3389 字,大约阅读时间需要 11 分钟。
题目大意: 一个容器高度为3,俩个成员都是1或2的字符串,判断容器长度最短多少可以装下俩个字符串
解题思路: 从字符串a的最后一个字符与字符串b的第一个字符开始,依次比较,找出最优解
法一:
#include#include #include using namespace std;int main() { char a[100000], b[100000]; while(scanf("%s%s", a, b) != EOF) { int l1, l2, l; l1 = strlen(a); l2 = strlen(b); if(l1 >= l2) l = l1; else l = l2; int i = l1 - 1, j = 0, max = 0; for(;j < l2 + l1;j++) { int s = 0; int m = i, n = j; for(;n >= l2 || a[m] - '0' + b[n] - '0' <= 3 || (m * n) < 0;m--, n--) { if(m < 0 || n < 0) { if(max < s) max = s; break; } if(n < l2) s++; } if(max == l) break; } l = l1 + l2- max; cout << l << endl; } return 0;}
算法解释:
法二:
#include#include #include using namespace std;{ char s1[128], s2[128]; while (scanf("%s %s", s1, s2) == 2) { int n1 = strlen(s1), n2 = strlen(s2); int ret = n1 + n2; for (int i = -n2; i <= n1; i++) { int ok = 1; { if (i + j >= 0 && i + j < n1) ok &= s1[i+j] - '0' + s2[j] - '0' <= 3; } if (ok) ret = min(ret, max(n1, i + n2) - min(i, 0)); } printf("%d\n", ret); } return 0;}
法三:
#include#include #include using namespace std;char a[105];char b[105];int main() { int i, j, count; while (scanf( "%s%s", a, b) != EOF) { int s = 0, t = 0; for (i = 0; i < strlen(a); i++) { count = 1; for (j = 0; j < strlen(b) && (i + j) < strlen(a) ; j++) if (a[j+i] == '2' && b[j] == '2') { count = 0; break; } if(count) break; } s = max(strlen(a), strlen(b) + i); for (i = 0; i < strlen(b); i++) { count = 1; for (j = 0; j < strlen(a) && (j + i) < strlen(b); j++) if (b[j+i] == '2' && a[j] == '2') { count = 0; break; } if (count) break; } t= max(strlen(b), strlen(a) + i); int l = min(t, s); printf("%d\n",l); memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); } return 0;}
错误思想:
#include#include #include int main(){ char str1[105],str2[105]; int i,length1,length2,length,flag1=1,flag=0,x,y; while(scanf("%s%s",str1,str2)!=EOF) { int k=0; int t=0; flag1=1; flag=0; length1=strlen(str1); length2=strlen(str2); length=length1; if(length2>length1) { length=length2; flag1=2; } for(i=0;i =length2) { flag=1; break; } } else if(flag1==2&&flag==0) { for(x=i,y=0;x =length1) { flag=1; break; } } if(flag==1) break; } if(flag==0) printf("%d\n",length1+length2); else if(flag==1) printf("%d\n",length); memset(str1,0,sizeof(str1)); memset(str2,0,sizeof(str2)); } return 0;}
转载地址:http://uugsi.baihongyu.com/