Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <set>
- #include <cstring>
- #include <fstream>
- using namespace std;
- typedef long long ll;
- const int maxn = 20;
- int n;
- ll k;
- int mat[maxn][3];
- const ll INF = 1e18;
- ll total_weght[1 << maxn];
- ll total_height[1 << maxn];
- ll dp[1 << maxn];
- ll rec(int bitmask) {
- if(bitmask == 0) {
- return INF;
- }
- if(dp[bitmask] != -1) {
- return dp[bitmask];
- }
- ll res = -1;
- for(int i = 0; i < n; i++) {
- if(bitmask & (1 << i)) {
- int above_cows = bitmask ^ (1 << i);
- ll weight_above = total_weght[above_cows];
- ll capacity_left = mat[i][2] - weight_above;
- if(capacity_left >= 0) {
- ll res2 = rec(above_cows);
- if(res2 >= 0) {
- res = max(res, min(capacity_left, res2));
- }
- }
- }
- }
- dp[bitmask] = res;
- return res;
- }
- int main()
- {
- ifstream cin("guard.in");
- ofstream cout("guard.out");
- ios_base::sync_with_stdio(false);
- cin >> n >> k;
- memset(dp, -1, sizeof dp);
- for(int i = 0; i < n; i++) {
- cin >> mat[i][0] >> mat[i][1] >> mat[i][2];
- }
- for(int bitmask = 0; bitmask < (1 << n); bitmask++) {
- total_weght[bitmask] = 0;
- total_height[bitmask] = 0;
- for(int i = 0; i < n; i++) {
- if(bitmask & (1 << i)) {
- total_weght[bitmask] += mat[i][1];
- total_height[bitmask] += mat[i][0];
- }
- }
- }
- ll res = -1;
- for(int bitmask = 0; bitmask < (1 << n); bitmask++) {
- if(total_height[bitmask] >= k) {
- res = max(res, rec(bitmask));
- }
- }
- if(res < 0) {
- cout << "Mark is too tall" << endl;
- }
- else {
- cout << res << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment