POJ 3158 Kickdown(我的水题之路——齿轮盒子,读题失败)

来源:互联网 发布:淘宝旺旺号怎么注册 编辑:IT博客网 时间:2019/10/15 19:48
Kickdown
Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 1271 Accepted: 587

Description

A research laboratory of a world-leading automobile company has received an order to create a special transmission mechanism, which allows for incredibly efficient kickdown — an operation of switching to lower gear. After several months of research engineers found that the most efficient solution requires special gears with teeth and cavities placed non-uniformly. They calculated the optimal flanks of the gears. Now they want to perform some experiments to prove their findings.

The first phase of the experiment is done with planar toothed sections, not round-shaped gears. A section of length n consists of n units. The unit is either a cavity of height h or a tooth of height 2h. Two sections are required for the experiment: one to emulate master gear (with teeth at the bottom) and one for the driven gear (with teeth at the top).

There is a long stripe of width 3h in the laboratory and its length is enough for cutting two engaged sections together. The sections are irregular but they may still be put together if shifted along each other.

The stripe is made of an expensive alloy, so the engineers want to use as little of it as possible. You need to find the minimal length of the stripe which is enough for cutting both sections simultaneously.

Input

There are two lines in the input file, each contains a string to describe a section. The first line describes master section (teeth at the bottom) and the second line describes driven section (teeth at the top). Each character in a string represents one section unit — 1 for a cavity and 2 for a tooth. The sections can not be flipped or rotated.

Each string is non-empty and its length does not exceed 100.

Output

Write a single integer number to the output file — the minimal length of the stripe required to cut off given sections.

Sample Input

sample input #121121121122212112sample input #21212121221212121sample input #3221122112221212

Sample Output

sample output #110sample output #28sample output #315

Source

Northeastern Europe 2006

完全体英文题,看题目看了我一个多小时,之后通过别人的AC代码分析才了解到了题意要干嘛- -,所以解题思路基本上就和别人的代码是一样的。

说说题意吧,我用另一种方式来说,情节可能和原题不同:
你可以理解为,生产了两种齿轮,2表示凸齿、1表示凹槽,凸齿处高度为2h,凹槽处高度为1h,现在有一个高度为3h的盒子,要去装这两个齿轮,问至少要多长才可以装得下,要求两个齿轮不可以横向翻转。

分析题意:
如果两个齿轮刚刚好严丝合缝的可以拼凑在一起,那么他们的总高度就是3h,如输入样例#2:
1212121221212121
则,这两个齿轮拼凑在一起,长度为8,高度为3h,只需要一个长度为8的盒子就可以了。 
如果两个齿轮只有部分可以拼凑在一起又怎么办呢,如以下这个样例:
2221121
2212222
如果不平移是不可能拼凑在一起的,所以我们进行一次平移:
2221121
      2212222
我们可以看到中间4个齿轮是可以拼在一起,这样这个时候的总长度为3 + 4 +3 = 10.
如果完全不可以拼凑,则如同输入样例#3:
2211221122
21212
所以两个齿轮只好并列放置:
2211221122               或者:       2211221122
                    21212               21212
长度为15.
到了现在题意应该很明白了吧!

解法:
因为n<=100,为弱数据,所以可以直接用暴力求解。我们分别选择其中一个字符串不动,另一个字符串从相对它的k位置开始匹配(k=0,1,2,...),如果找得到可以刚刚好卡进的凸齿和凹槽的情况,就输出当前总长度即可;如果没有就将两个字符串的位置颠倒,再进行一次这样的平移+匹配。

注意点:
1)在匹配过程中,匹配的数组不要越界,j < len1 && j < len2 + i.

代码(1AC):
#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>using namespace std;char str1[110];char str2[110];int getlens(char sect1[], char sect2[]){    int len1, len2;    int i, j;    int flag;    len1 = strlen(sect1);    len2 = strlen(sect2);    for (i = 0; i < len1; i++){        flag = 1;        for (j = i; j < len1 && j < i + len2; j++){            if (sect1[j] == '2' && sect2[j - i] == '2'){                flag = 0;            }        }        if (flag){            return max(len1, i + len2);        }    }    return len1 + len2;}int main(void){    int len;    scanf("%s%s", str1, str2);    len = min(getlens(str1, str2), getlens(str2, str1));    printf("%d\n", len);    return 0;}