ГЖО 7-8 класс 2019 год
Задача D. Лучшие друзья
Айбай и Абар играют игру. У них есть два массива целых положительных чисел $a$ и $b$. Айбай может взять два соседних числа из массива $a$ и заменить их суммой этих двух чисел. Например : $[2, 4, 1, 7]$ -> $[2, 5, 7]$. Абар может делать то же самое с массивом $b$. Так как они лучшие друзья, то они хотят, чтобы получившиеся массивы были одинаковыми. Но они очень любят большие массивы, поэтому они хотят, чтобы получившиеся массивы были еще и максимальной длины. Найдите максимальную возможную длину получившихся массивов.
5 11 2 3 5 7 4 11 7 3 7Ответ
3Вход
2 1 2 1 100Ответ
-1Вход
3 1 2 3 3 1 2 3Ответ
3( Batyr Sardarbekov )
Комментарий/решение:
#include <bits/stdc++.h>
#define yes cout << "Yes\n"
#define no cout << "No\n"
#define Zhussip ios_base::sync_with_stdio(false), cin.tie(nullptr),cout.tie(nullptr)
#define all(a) (a).begin(),(a).end()
typedef long long ll;
#define int long long
const int maxn = 4e5 + 2008;
const long long inf = 1e18 + 2008;
const int mod = 1e9 + 7;
using namespace std;
int a[maxn], b[maxn], pref[maxn], prefb[maxn], n, m;
int rec(int v, int vb) {
int left = vb + 1;
if (vb >= m || v >= n) return 0;
for (int l = v + 1; l <= n; l++) {
while (prefb[left] - prefb[vb] < pref[l] - pref[v] && left < m) {
left++;
}
if (pref[l] - pref[v] == prefb[left] - prefb[vb]) {
return rec(l, left) + 1;
}
}
return 0;
}
void keepcoding() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
pref[i] = pref[i - 1] + a[i];
}
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> b[i];
prefb[i] = prefb[i - 1] + b[i];
}
if (prefb[m] != pref[n]) {
cout << -1;
return;
}
int ans = rec(0, 0);
cout << ans;
}
signed main() {
Zhussip;
srand(time(0));
int _ = 1;
while (_ > 0) {
keepcoding();
_--;
}
return 0;
}
Возможно, что при неправильном наборе формул, они будут
доредактированы модератором. При этом содержание не будет меняться.