Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 30 pts http://contest.uni-smr.ac.ru/ru/problemset/6141/
- # include <iostream>
- # include <vector>
- void search(size_t &n, size_t cur_n, std::vector<std::vector<size_t>> &m, std::vector<size_t> nums, uint64_t &res,
- size_t &count, std::vector<size_t> &res_groups) {
- if (cur_n == n) {
- if (!nums.empty()) {
- bool allowed = true;
- uint64_t sum = m[nums[0]][2];
- for (size_t i = 1; i < nums.size(); i++) {
- if (m[nums[i - 1]][0] < m[nums[i]][0] && m[nums[i - 1]][0] + m[nums[i - 1]][1] < m[nums[i]][0] + m[nums[i]][1]) {
- sum += m[nums[i]][2];
- } else {
- allowed = false;
- break;
- }
- }
- if (allowed) {
- if (sum > res) {
- res = sum;
- count = nums.size();
- res_groups = nums;
- }
- }
- }
- } else {
- search(n, cur_n + 1, m, nums, res, count, res_groups);
- nums.push_back(cur_n);
- search(n, cur_n + 1, m, nums, res, count, res_groups);
- }
- }
- int main() {
- size_t n;
- std::cin >> n;
- std::vector<std::vector<size_t>> m(n);
- for (size_t i = 0; i < n; i++) {
- size_t a, w, c;
- std::cin >> a >> w >> c;
- m[i].resize(3);
- m[i][0] = a;
- m[i][1] = w;
- m[i][2] = c;
- }
- uint64_t res = 0;
- size_t count = 0;
- std::vector<size_t> nums;
- std::vector<size_t> res_groups;
- search(n, 0, m, nums, res, count, res_groups);
- std::cout << res << '\n';
- std::cout << count << '\n';
- for (auto elem : res_groups) {
- std::cout << elem + 1 << ' ';
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment