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].
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(vector<int> &a) {
// write your code in C++14 (g++ 6.2.0)
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<int> pref(n+1)
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<int> pref(n), suff(n);
pref[0] = a[0];
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<int> pref(n), suff(n);
pref[0] = a[0];
FORI(i,1,n){
pref[i] = a[i] + pref[i-1] / 2;
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<int> pref(n), suff(n);
pref[0] = a[0];
FORI(i,1,n){
pref[i] = a[i] + pref[i-1] / 2;
}
suff[n-1] = a[n-1];
FORD(i,n-1,-1){
pref[i] = a[i] + pref[i-1] / 2;
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<int> pref(n), suff(n);
pref[0] = a[0];
FORI(i,1,n){
pref[i] = a[i] + pref[i-1] / 2;
}
suff[n-1] = a[n-1];
FORD(i,n-1,0){
suff[i-1] = a[i] + pref[i-1] / 2;
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<int> pref(n), suff(n);
pref[0] = a[0];
FORI(i,1,n){
pref[i] = a[i] + pref[i-1] / 2;
}
suff[n-1] = a[n-1];
FORD(i,n-1,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<int> pref(n), suff(n);
pref[0] = a[0];
FORI(i,1,n){
pref[i] = a[i] + pref[i-1] / 2;
}
suff[n-1] = a[n-1];
FORD(i,n-1,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
FORI(i,0,n){
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<int> pref(n+1, 0), suff(n+1, 0);
pref[0] = a[0];
FORI(i,1,n){
pref[i] = a[i] + pref[i-1] / 2;
}
suff[n-1] = a[n-1];
FORD(i,n-1,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
FORI(i,0,n){
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<int> pref(n+1, 0), suff(n+1, 0);
pref[0] = a[0];
FORI(i,1,n){
pref[i] = a[i] + pref[i-1] / 2;
}
suff[n-1] = a[n-1];
FORD(i,n-1,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
FORI(i,0,n){
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<int> pref(n+1, 0), suff(n+1, 0);
FORI(i,1,n+1){
pref[i] = a[i] + pref[i-1] / 2;
}
suff[n-1] = a[n-1];
FORD(i,n-1,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
FORI(i,0,n){
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<int> pref(n+1, 0), suff(n+1, 0);
FORI(i,1,n+1){
pref[i] = a[i-1] + pref[i-1] / 2;
}
FORD(i,n,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
FORI(i,0,n){
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<LL> pref(n+1, 0), suff(n+1, 0);
FORI(i,1,n+1){
pref[i] = a[i-1] + pref[i-1] / 2;
}
FORD(i,n,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
LL ans = 0;
FORI(i,0,n){
ans
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<LL> pref(n+1, 0), suff(n+1, 0);
FORI(i,1,n+1){
pref[i] = a[i-1] + pref[i-1] / 2;
}
FORD(i,n,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
LL ans = 0;
FORI(i,0,n+1){
ans = max(ans, pref[i])
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<LL> pref(n+1, 0), suff(n+1, 0);
FORI(i,1,n+1){
pref[i] = a[i-1] + pref[i-1] / 2;
}
FORD(i,n,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
LL ans = 0;
FORI(i,0,n){
ans = max(ans, pref[i] + a[i] + suff[i+1])
}
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<LL> pref(n+1, 0), suff(n+1, 0);
FORI(i,1,n+1){
pref[i] = a[i-1] + pref[i-1] / 2;
}
FORD(i,n,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
LL ans = 0;
FORI(i,0,n){
ans = max(ans, pref[i] / 2 + a[i] + suff[i+1] / 2);
}
return ans
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<LL> pref(n+1, 0), suff(n+1, 0);
FORI(i,1,n+1){
pref[i] = a[i-1] + pref[i-1] / 2;
}
FORD(i,n,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
LL ans = 0;
FORI(i,0,n){
ans = max(ans, pref[i] / 2 + a[i] + suff[i+1] / 2);
}
return ans;
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<LL> pref(n+1, 0), suff(n+1, 0);
FORI(i,1,n+1){
pref[i] = a[i-1] + pref[i-1] / 2;
}
FORD(i,n,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
LL ans = 0;
FORI(i,0,n){
ans = max(ans, pref[i] / 2 + a[i] + suff[i+1] / 2);
}
return ans;
}
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define LL long long int
#define ULL unsigned LL
#define LD long double
#define FI first
#define SE second
#define PB push_back
#define PF push_front
#define V vector
#define PQ priority_queue
#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x).size()
#define FORI(i, a, b) for(int i = a; i < b ; ++i)
#define FORD(i, a, b) for(int i = a; i > b ; --i)
using namespace std;
using pii = pair<int, int>;
const int MOD = 1e9 + 7;
int solution(V<int> &a) {
int n = a.size();
V<LL> pref(n+1, 0), suff(n+1, 0);
FORI(i,1,n+1){
pref[i] = a[i-1] + pref[i-1] / 2;
}
FORD(i,n,0){
suff[i-1] = a[i-1] + suff[i] / 2;
}
LL ans = 0;
FORI(i,0,n){
ans = max(ans, pref[i] / 2 + a[i] + suff[i+1] / 2);
}
return ans;
}
The solution obtained perfect score.