题目大意: 一个容器高度为3,俩个成员都是1或2的字符串,判断容器长度最短多少可以装下俩个字符串
解题思路: 从字符串a的最后一个字符与字符串b的第一个字符开始,依次比较,找出最优解
法一:
#include <stdio.h>
#include <iostream>
#include <string.h>
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 <stdio.h>
#include <string.h>
#include <algorithm>
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<stdio.h>
#include<iostream>
#include<string.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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<length;i++)
{
if(flag1==1&&flag==0)
{
for(y=0,x=i;y<length2&&x<length2;y++,x++)
{
if(str1[x]=='2'&&str2[y]=='2')
{
break;
}
}
if(y>=length2)
{
flag=1;
break;
}
}
else if(flag1==2&&flag==0)
{
for(x=i,y=0;x<length2&&y<length1;x++,y++)
{
if(str2[x]=='2'&&str1[y]=='2')
{
break;
}
}
if(y>=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;
}