给出两个长度分别为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 }