链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4463
code
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int getMinLen(char* n1 ,char* n2, char* n2_)
{
int len_n1 = strlen(n1),len_n2 = strlen(n2);
for(int i = 0 ; i < len_n2; i ++)
{
n2_[i] = '3' - n2[i] + '0';
}
int i = 0 , j = 0, start= 1 ;
while(i < len_n1 && j < len_n2)
{
if(n1[i] <= n2_[j])
{ i++; j++;}
else
{
i = start;
j = 0;
start ++;
}
}
int minLen = 0;
if( j == len_n2)
minLen = len_n1;
else if( j == 0 && i == len_n1)
minLen = len_n1 + len_n2;
else if(j != 0 && i == len_n1)
minLen = len_n1 + len_n2 - j;
return minLen;
}
int main()
{
char n1[120],n2[120],n2_[120];
while(scanf("%s",n1) != EOF)
{
scanf("%s",n2);
int len_n1 = strlen(n1),len_n2 = strlen(n2);
int rightMinLen = getMinLen(n1,n2,n2_);
int leftMinLen = getMinLen(n2,n1,n2_);
printf("%d\n", rightMinLen<leftMinLen ? rightMinLen : leftMinLen);
}
return 0;
}
注意事项:
1)一开始只考虑下面一块纸片,上面一块纸片往右边移动,导致WA。修改程序编程左边也移动,然后比较左右移动获取的最小值然后输出