Skip to content

Commit f061174

Browse files
Create Equal Cut.cpp
1 parent 26bf56d commit f061174

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <algorithm>
4+
5+
using namespace std;
6+
7+
long long find_difference(long long a, long long b, long long c, long long d)
8+
{
9+
long long minimum = min(min(a, b), min(c, d));
10+
long long maximum = max(max(a, b), max(c, d));
11+
12+
return maximum - minimum;
13+
}
14+
15+
int main()
16+
{
17+
int no_of_elements;
18+
cin >> no_of_elements;
19+
20+
vector <int> A(no_of_elements + 1);
21+
for(int i = 1; i <= no_of_elements; i++)
22+
{
23+
cin >> A[i];
24+
}
25+
26+
vector <long long> sum(no_of_elements + 1);
27+
for(int i = 1; i <= no_of_elements; i++)
28+
{
29+
sum[i] = sum[i - 1] + A[i];
30+
}
31+
32+
vector <long long> best_P(no_of_elements + 1), best_Q(no_of_elements + 1);
33+
for(int i = 1, j = 2; j <= no_of_elements; j++)
34+
{
35+
//[1, i], [i + 1, j]
36+
int break_point = i;
37+
for(break_point = i; break_point < j; break_point++)
38+
{
39+
long long segment_1 = sum[break_point], segment_2 = sum[j] - sum[break_point];
40+
long long segment_1_before = sum[break_point - 1], segment_2_before = sum[j] - sum[break_point - 1];
41+
//cout << "j = " << j << " Before " << segment_1_before << " " << segment_2_before << " Now " << segment_1 << " " << segment_2 << "\n";
42+
43+
if(abs(segment_2 - segment_1) <= abs(segment_1_before - segment_2_before))
44+
{
45+
i = break_point;
46+
}
47+
else
48+
{
49+
break;
50+
}
51+
}
52+
53+
best_P[j] = sum[i], best_Q[j] = sum[j] - sum[i];
54+
}
55+
56+
vector <long long> best_R(no_of_elements + 1), best_S(no_of_elements);
57+
for(int k = no_of_elements, j = no_of_elements - 1; j >= 1; j--)
58+
{
59+
//[j + 1, k - 1], [k, n]
60+
int break_point = k;
61+
for(break_point = k; break_point > j; break_point--)
62+
{
63+
long long segment_3 = sum[break_point - 1] - sum[j], segment_4 = sum[no_of_elements] - sum[break_point - 1];
64+
long long segment_3_before = sum[break_point] - sum[j], segment_4_before = sum[no_of_elements] - sum[break_point];
65+
66+
if(abs(segment_3 - segment_4) <= abs(segment_3_before - segment_4_before))
67+
{
68+
k = break_point;
69+
}
70+
else
71+
{
72+
break;
73+
}
74+
}
75+
76+
best_R[j] = sum[k - 1] - sum[j], best_S[j] = sum[no_of_elements] - sum[k - 1];
77+
}
78+
79+
const long long oo = 1e18;
80+
long long answer = oo;
81+
for(int j = 2; j < no_of_elements; j++)
82+
{
83+
//cout << "j = " << j << "(" << best_P[j] << "," << best_Q[j] << "," << best_R[j] << "," << best_S[j] << ")\n";
84+
answer = min(answer, find_difference(best_P[j], best_Q[j], best_R[j], best_S[j]));
85+
}
86+
87+
cout << answer << "\n";
88+
return 0;
89+
}

0 commit comments

Comments
 (0)