#include <iostream>
#include <vector>
#include <fstream>
int64_t PowerBalance(const std::vector<int64_t>& power, const int begin_idx, const int end_idx)
{
int64_t balance = 0;
for (int i = begin_idx; i <= end_idx; i++)
{
balance += power[i];
}
return balance;
}
int64_t FindMinCost(
const std::vector<int64_t>& power,
int begin_idx, int end_idx)
{
// delete edge wires
for (int i = begin_idx; i < end_idx; i++)
{
if (power[i] == 0)
begin_idx++;
else break;
}
for (int i = end_idx; i > begin_idx; i--)
{
if (power[i] == 0)
end_idx--;
else break;
}
int64_t rbalance = PowerBalance(power, begin_idx, end_idx);
int64_t lbalance = 0;
std::pair<int, int> c_gap(begin_idx, begin_idx);
std::pair<int, int> b_gap(begin_idx, begin_idx);
int64_t power_in_c_gap = 0;
int64_t power_in_b_gap = 0;
for (int i = begin_idx; i < end_idx; i++)
{
lbalance += power[i];
rbalance -= power[i];
bool balanced = (lbalance >= 0 && rbalance >= 0);
bool is_factory = power[i] < 0;
if (balanced && !is_factory)
{
c_gap.second++;
if (power[i] > 0)
power_in_c_gap += power[i];
}
else
{
if (c_gap.second - c_gap.first > b_gap.second - b_gap.first)
{
b_gap = c_gap;
power_in_b_gap = power_in_c_gap;
}
if (balanced)
{
c_gap = { i, i + 1 };
}
else
{
c_gap = { i + 1, i + 1 };
}
power_in_c_gap = 0;
}
}
if (b_gap.second - b_gap.first <= 0) return end_idx - begin_idx;
else
{
return FindMinCost(power, begin_idx, b_gap.first) +
FindMinCost(power, b_gap.second, end_idx);
}
}
int main()
{
// input
int64_t n;
std::cin >> n;
std::vector<int64_t> power(n);
for (int64_t i = 0; i < n; i++)
std::cin >> power[i];
// balance
int64_t balance = PowerBalance(power, 0, power.size() - 1);
if (balance < 0)
{
std::cout << -1;
return 0;
}
std::cout << FindMinCost(power, 0, power.size() - 1u);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include <iostream> #include <vector> #include <fstream> int64_t PowerBalance(const std::vector<int64_t>& power, const int begin_idx, const int end_idx) { int64_t balance = 0; for (int i = begin_idx; i <= end_idx; i++) { balance += power[i]; } return balance; } int64_t FindMinCost( const std::vector<int64_t>& power, int begin_idx, int end_idx) { // delete edge wires for (int i = begin_idx; i < end_idx; i++) { if (power[i] == 0) begin_idx++; else break; } for (int i = end_idx; i > begin_idx; i--) { if (power[i] == 0) end_idx--; else break; } int64_t rbalance = PowerBalance(power, begin_idx, end_idx); int64_t lbalance = 0; std::pair<int, int> c_gap(begin_idx, begin_idx); std::pair<int, int> b_gap(begin_idx, begin_idx); int64_t power_in_c_gap = 0; int64_t power_in_b_gap = 0; for (int i = begin_idx; i < end_idx; i++) { lbalance += power[i]; rbalance -= power[i]; bool balanced = (lbalance >= 0 && rbalance >= 0); bool is_factory = power[i] < 0; if (balanced && !is_factory) { c_gap.second++; if (power[i] > 0) power_in_c_gap += power[i]; } else { if (c_gap.second - c_gap.first > b_gap.second - b_gap.first) { b_gap = c_gap; power_in_b_gap = power_in_c_gap; } if (balanced) { c_gap = { i, i + 1 }; } else { c_gap = { i + 1, i + 1 }; } power_in_c_gap = 0; } } if (b_gap.second - b_gap.first <= 0) return end_idx - begin_idx; else { return FindMinCost(power, begin_idx, b_gap.first) + FindMinCost(power, b_gap.second, end_idx); } } int main() { // input int64_t n; std::cin >> n; std::vector<int64_t> power(n); for (int64_t i = 0; i < n; i++) std::cin >> power[i]; // balance int64_t balance = PowerBalance(power, 0, power.size() - 1); if (balance < 0) { std::cout << -1; return 0; } std::cout << FindMinCost(power, 0, power.size() - 1u); return 0; } |
English