HackerRank–Equal Stacks
题目描述
有三个栈,每个栈里放了一些高度不一的圆柱体,问如何从最上面拿走任意数量的圆柱体使三个栈的高度一致,最大可以得到的高度是多少?
// 因为栈为空也视为高度一致,所以一定有解。
分析
只需要计算出每一个圆柱体处的当前总高度,即求一个前缀和代替之前的单独的高度值。
每次比较两个栈,把较高的顶部的圆柱体拿掉(退栈),直到使两个栈等高,重复该操作使 height_1 = height_2= height_3 即可。
然后要注意题目里给的圆柱体高度是从上到下的,输入的时候需要反过来。
实现
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
int equalize_stack(vector<int>& a, vector<int>& b) {
if (a.empty()) {
while (!b.empty()) b.pop_back();
return 0;
}
if (b.empty()) {
while (!a.empty()) a.pop_back();
return 0;
}
while (!a.empty() || !b.empty()) {
int al = a.empty() ? 0 : a[a.size()-1];
int bl = b.empty() ? 0 : b[b.size()-1];
if (al > bl) {
a.pop_back();
} else if (al < bl) {
b.pop_back();
} else {
return al;
}
}
return 0;
}
int main(){
int n1;
int n2;
int n3;
cin >> n1 >> n2 >> n3;
vector<int> h1(n1);
for(int h1_i = n1-1; h1_i >= 0; h1_i--){
cin >> h1[h1_i];
}
for (int i = 0; i < n1; i++) {
h1[i] += i ? h1[i - 1] : 0;
// cout << h1[i] << ' ';
}
vector<int> h2(n2);
for(int h2_i = n2-1; h2_i >= 0; h2_i--){
cin >> h2[h2_i];
}
for (int i = 0; i < n2; ++i) {
h2[i] += i ? h2[i - 1] : 0;
// cout << h2[i] << ' ';
}
vector<int> h3(n3);
for(int h3_i = n3-1;h3_i >= 0; h3_i--){
cin >> h3[h3_i];
}
for (int i = 0; i < n3; ++i) {
h3[i] += i ? h3[i - 1] : 0;
// cout << h3[i] << ' ';
}
int al = equalize_stack(h1, h2);
int bl = equalize_stack(h2, h3);
while (al != bl) {
al = equalize_stack(h1, h2);
bl = equalize_stack(h2, h3);
}
cout << al << endl;
return 0;
}