Submission #1253433

#TimeUsernameProblemLanguageResultExecution timeMemory
1253433hoa208Bali Sculptures (APIO15_sculpture)C++20
0 / 100
1096 ms328 KiB
#include <iostream>
#include <vector>
#include <climits>
using namespace std;

int n, A, B;
vector<int> Y;
vector<int> prefix_sum;
int min_beauty = INT_MAX;

// Hàm tính tổng từ chỉ số l đến r (0-indexed)
int get_sum(int l, int r) {
    return prefix_sum[r + 1] - prefix_sum[l];
}

// Hàm đệ quy để chia mảng thành groups_left nhóm liên tiếp
void dfs(int pos, int groups_left, vector<int>& group_sums) {
    if (groups_left == 1) {
        if (pos >= n) return; // không đủ phần tử
        int total = get_sum(pos, n - 1);
        int or_val = 0;
        for (int sum : group_sums)
            or_val |= sum;
        or_val |= total;
        min_beauty = min(min_beauty, or_val);
        return;
    }

    for (int i = pos; i <= n - groups_left; ++i) {
        int total = get_sum(pos, i);
        group_sums.push_back(total);
        dfs(i + 1, groups_left - 1, group_sums);
        group_sums.pop_back();
    }
}

int main() {
    // Nhập đầu vào
    cin >> n >> A >> B;
    Y.resize(n);
    prefix_sum.resize(n + 1, 0);

    for (int i = 0; i < n; ++i) {
        cin >> Y[i];
        prefix_sum[i + 1] = prefix_sum[i] + Y[i];
    }

    // Duyệt số nhóm từ A đến B
    for (int x = A; x <= B; ++x) {
        vector<int> group_sums;
        dfs(0, x, group_sums);
    }

    cout << min_beauty << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...