CodeForces 1983C Have Your Cake and Eat It Too

题目链接:CodeForces 1983C【Have Your Cake and Eat It Too】



思路

       先向上取整计算出tot/3,然后依次枚举abc三个数组取区间的前后顺序,对于每个顺序依次从前往后枚举,直到取得的区间数字之和大于等于tot/3,就对下一个数组进行枚举,直到所有数组都满足取出的区间数字之和大于等于 tot/3


代码

#include <bits/stdc++.h>
#include <vector>
using namespace std;
#define ll long long
const int N = 2e5 + 10;
int a[5][N];

void solve() {
  ll n, sum = 0;
  cin >> n;

  for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= n; j++) {
      cin >> a[i][j];
    }
  }

  for (int i = 1; i <= n; i++) {
    sum += a[1][i];
  }

  ll need = (sum + 2) / 3;
  vector<int> p{1, 2, 3};

  do {
    vector<int> l(4), r(4);
    ll s = 0, i = 1;
    bool ok = true;
    for (auto t : p) {
      int j = i;
      while (j <= n && s < need) {
        s += a[t][j++];
      }
      ok &= (s >= need);
      l[t] = i;
      r[t] = j - 1;
      i = j;
      s = 0;
    }
    if (!ok) {
      continue;
    }
    for (int i = 1; i <= 3; i++) {
      cout << l[i] << ' ' << r[i] << ' ';
    }
    cout << endl;
    return;
  } while (next_permutation(p.begin(), p.end()));

  cout << "-1" << endl;
}
int main() {
    int t;
    cin >> t;

    while (t--) {
        solve();
    }
    return 0;
}

posted @ 2024-07-16 14:57  薛定谔的AC  阅读(3)  评论(0编辑  收藏  举报