There are N stacks of coins, numbered from 0 to N−1. The Kth stack has A[K] coins. In one move we can pick two coins from any stack we choose, put the first coin away and place the second coin on the adjacent stack (either to the left or to the right of the original stack).
What is the maximum number of coins that can be accumulated in a single stack?
Write a function:
int solution(vector<int> &A);
that, given an array A of N integers, recording the heights of the stacks, returns the maximum number of coins that can be accumulated in one stack after performing any number of moves as described above.
Examples:
1. Given A = [2, 3, 1, 3], the function should return 5. A possible sequence of moves is: [2, 3, 1, 3] → [0, 4, 1, 3] → [0, 4, 2, 1] → [0, 5, 0, 1].
2. Given A = [3, 7, 0, 5], the function should return 9. A possible sequence of moves is: [3, 7, 0, 5] → [1, 8, 0, 5] → [1, 8, 1, 3] → [1, 8, 2, 1] → [1, 9, 0, 1].
3. Given A = [1, 1, 1, 1, 1], the function should return 1. No move can be performed.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [1..200,000];
- each element of array A is an integer within the range [0..100,000,000].
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
int solution(vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
if(A.empty()) return 0;
if(A.size() == 1) return A.front();
vector<int> left(A.size(), 0), right(A.size(), 0);
left[0] = A[0];
for(int i = 1; i != A.size(); ++i){
left[i] = left[i-1]/2 + A[i];
}
right.back() = A.back();
for(int i = A.size()-2; i >= 0; --i){
right[i] = right[i+1]/2 + A[i];
}
int result = max(A[0] + right[1]/2, A.back() + left[A.size()-1]/2);
for(int i = 1; i != A.size()-1; ++i){
int current = A[i] + left[i-1]/2 + right[i+1]/2;
if(result < current) result = current;
}
return result;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
int solution(vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
if(A.empty()) return 0;
if(A.size() == 1) return A.front();
vector<int> left(A.size(), 0), right(A.size(), 0);
left[0] = A[0];
for(int i = 1; i != A.size(); ++i){
left[i] = left[i-1]/2 + A[i];
}
right.back() = A.back();
for(int i = A.size()-2; i >= 0; --i){
right[i] = right[i+1]/2 + A[i];
}
int result = max(A[0] + right[1]/2, A.back() + left[A.size()-2]/2);
for(int i = 1; i != A.size()-1; ++i){
int current = A[i] + left[i-1]/2 + right[i+1]/2;
if(result < current) result = current;
}
return result;
}
}
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
int solution(vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
if(A.empty()) return 0;
if(A.size() == 1) return A.front();
vector<int> left(A.size(), 0), right(A.size(), 0);
left[0] = A[0];
for(int i = 1; i != A.size(); ++i){
left[i] = left[i-1]/2 + A[i];
}
right.back() = A.back();
for(int i = A.size()-2; i >= 0; --i){
right[i] = right[i+1]/2 + A[i];
}
int result = max(A[0] + right[1]/2, A.back() + left[A.size()-2]/2);
for(int i = 1; i != A.size()-1; ++i){
int current = A[i] + left[i-1]/2 + right[i+1]/2;
if(result < current) result = current;
}
return result;
}
}
Solution.java:8: error: <identifier> expected int solution(vector<int> &A) { ^ Solution.java:8: error: ';' expected int solution(vector<int> &A) { ^ Solution.java:8: error: illegal start of type int solution(vector<int> &A) { ^ Solution.java:8: error: <identifier> expected int solution(vector<int> &A) { ^ Solution.java:8: error: ';' expected int solution(vector<int> &A) { ^ Solution.java:10: error: illegal start of type if(A.empty()) return 0; ^ Solution.java:10: error: ';' expected if(A.empty()) return 0; ^ Solution.java:10: error: invalid method declaration; return type required if(A.empty()) return 0; ^ Solution.java:10: error: ';' expected if(A.empty()) return 0; ^ Solution.java:11: error: illegal start of type if(A.size() == 1) return A.front(); ^ Solution.java:11: error: <identifier> expected if(A.size() == 1) return A.front(); ^ Solution.java:11: error: ';' expected if(A.size() == 1) return A.front(); ^ Solution.java:11: error: illegal start of type if(A.size() == 1) return A.front(); ^ Solution.java:11: error: <identifier> expected if(A.size() == 1) return A.front(); ^ Solution.java:11: error: ';' expected if(A.size() == 1) return A.front(); ^ Solution.java:11: error: illegal start of type if(A.size() == 1) return A.front(); ^ Solution.java:11: error: ';' expected if(A.size() == 1) return A.front(); ^ Solution.java:11: error: invalid method declaration; return type required if(A.size() == 1) return A.front(); ^ Solution.java:12: error: <identifier> expected vector<int> left(A.size(), 0), right(A.size(), 0); ^ Solution.java:12: error: ';' expected vector<int> left(A.size(), 0), right(A
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
int solution(vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
if(A.empty()) return 0;
if(A.size() == 1) return A.front();
vector<int> left(A.size(), 0), right(A.size(), 0);
left[0] = A[0];
for(int i = 1; i != A.size(); ++i){
left[i] = left[i-1]/2 + A[i];
}
right.back() = A.back();
for(int i = A.size()-2; i >= 0; --i){
right[i] = right[i+1]/2 + A[i];
}
int result = max(A[0] + right[1]/2, A.back() + left[A.size()-1]/2);
for(int i = 1; i != A.size()-1; ++i){
int current = A[i] + left[i-1]/2 + right[i+1]/2;
if(result < current) result = current;
}
return result;
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
int solution(vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
if(A.empty()) return 0;
if(A.size() == 1) return A.front();
vector<int> left(A.size(), 0), right(A.size(), 0);
left[0] = A[0];
for(int i = 1; i != A.size(); ++i){
left[i] = left[i-1]/2 + A[i];
}
right.back() = A.back();
for(int i = A.size()-2; i >= 0; --i){
right[i] = right[i+1]/2 + A[i];
}
int result = max(A[0] + right[1]/2, A.back() + left[A.size()-2]/2);
for(int i = 1; i != A.size()-1; ++i){
int current = A[i] + left[i-1]/2 + right[i+1]/2;
if(result < current) result = current;
}
return result;
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
int solution(vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
if(A.empty()) return 0;
if(A.size() == 1) return A.front();
vector<int> left(A.size(), 0), right(A.size(), 0);
left[0] = A[0];
for(int i = 1; i != A.size(); ++i){
left[i] = left[i-1]/2 + A[i];
}
right.back() = A.back();
for(int i = A.size()-2; i >= 0; --i){
right[i] = right[i+1]/2 + A[i];
}
int result = max(A[0] + right[1]/2, A.back() + left[A.size()-2]/2);
for(int i = 1; i != A.size()-1; ++i){
int current = A[i] + left[i-1]/2 + right[i+1]/2;
if(result < current) result = current;
}
return result;
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
int solution(vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
if(A.empty()) return 0;
if(A.size() == 1) return A.front();
vector<int> left(A.size(), 0), right(A.size(), 0);
left[0] = A[0];
for(int i = 1; i != A.size(); ++i){
left[i] = left[i-1]/2 + A[i];
}
right.back() = A.back();
for(int i = A.size()-2; i >= 0; --i){
right[i] = right[i+1]/2 + A[i];
}
int result = max(A[0] + right[1]/2, A.back() + left[A.size()-2]/2);
for(int i = 1; i != A.size()-1; ++i){
int current = A[i] + left[i-1]/2 + right[i+1]/2;
if(result < current) result = current;
}
return result;
}
The solution obtained perfect score.