uva 1588 - Kickdown

来源:互联网 发布:大数据数据采集ppt 编辑:程序博客网 时间:2024/05/16 07:15

传送门:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4463

题意:给出两个长度为n1,n2(n1,n2<=100)且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器,求能够容纳它们的最短容器长度。

思路:先将n1固定不动,n2从第一位与n1比较是否两个相加大于四,是的话就将n2向右移动一位,再从头比较,直到没有任何一列相加大于四就记录下这种情况的最短长度;

然后将n2固定不动,执行一样的操作,求出另一个最段长度,最后取最小的

代码

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<iostream>#include<queue>#include<stack>#include <algorithm>#define LL long long #define MAX 30000#define INF 0x3f3f3f3fusing namespace std;char a[210], b[210]; int main(){     freopen("1.txt" , "r" , stdin);    int i, j, len1, len2, ans, l1, l2;    memset(a, 0, sizeof(a));    memset(b, 0, sizeof(b));    while(scanf("%s%s", a, b) != EOF)    {        len1 = strlen(a);        len2 = strlen(b);        ans = max(len1, len2);        for(i = 0; i < len1; i++)        {            for(j = 0; j < len2; j++)            {                if(a[i+j] + b[j] - '0'> '3')                {                    break;                }            }            if (j == len2)            {                break;            }        }        l1 = i + len2;         for(i = 0; i < len2; i++)        {            for(j = 0; j < len1; j++)            {                if(b[i+j] + a[j] - '0'> '3')                {                    break;                }            }            if (j == len1)            {                break;            }        }        l2 = i + len1;        ans = max(ans, min(l1, l2));        cout << ans << endl;        memset(a, 0, sizeof(a));        memset(b, 0, sizeof(b));    }    return 0;}
0 0