UVa-1588 Kickdown(换低档装置)

Posted starpast

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa-1588 Kickdown(换低档装置)相关的知识,希望对你有一定的参考价值。

给出两个长度分别为n1,n2(n1,n2≤100)且每列高度只为1或2的长条(每个长条的一边是齐平的)。需要将它们放入一个高度为3的容器,问能够容纳它们的最短容器长度。

原题及输出格式见https://vjudge.net/problem/UVA-1588

思路:将较长的一根固定,用短长条去遍历即可。本题的关键在于两点

1.将完全内部嵌合以及部分嵌合的情况分类讨论。

2.不仅有右方部分嵌合,别忘了短条在左方部分嵌合的情况。(这个左方是相对的,看你怎么想了)

以下是我的C++代码:

技术分享图片
 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 using namespace std;
 5 string A, a;
 6 int main()
 7 {
 8     while (cin >> A >> a)
 9     {
10         int rec = 0, MIN = 200; //最终答案不会超过200
11         if (a.size() > A.size())swap(A, a);
12         auto j = A.size(), k = a.size();
13         string A = string(a.size(), 0) + ::A + string(a.size(), 0);//作用域运算符取得外部变量,之后便隐藏掉外部A
14         auto J = A.size();
15         for (decltype(a.size())i = 0; i < J - k; ++i)
16         {
17             decltype(a.size())m = 0, n = i;
18             for (; m < k; ++m, ++n)
19             {
20                 if (A[n] - 0 + a[m] - 0 <= 3)continue;
21                 else break;
22             }
23             if (m == k)
24             {
25                 if (i < k) { if (k - i + j < MIN)MIN = k - i + j; }   //左嵌合
26                 else if (i > j) { if (i < MIN)MIN = i; } //右嵌合
27                 else { if (j < MIN)MIN = j; }
28             }
29         }
30         cout << MIN << endl;
31     }
32     return 0;
33 }
View Code

以上是关于UVa-1588 Kickdown(换低档装置)的主要内容,如果未能解决你的问题,请参考以下文章

Uva 1588.Kickdown

UVA1588 Kickdown

Uva 1588 Kickdown

uva1588kickdown

数组与字符串 UVa1588 Kickdown

换抵挡装置(Kickdown)