当前位置: 代码迷 >> 综合 >> bzoj3824 Guard Mark
  详细解决方案

bzoj3824 Guard Mark

热度:1   发布时间:2024-01-13 10:59:28.0

Description

Farmer John and his herd are playing frisbee. Bessie throws the
frisbee down the field, but it’s going straight to Mark the field hand
on the other team! Mark has height H (1 <= H <= 1,000,000,000), but
there are N cows on Bessie’s team gathered around Mark (2 <= N <= 20).
They can only catch the frisbee if they can stack up to be at least as
high as Mark. Each of the N cows has a height, weight, and strength.
A cow’s strength indicates the maximum amount of total weight of the
cows that can be stacked above her. Given these constraints, Bessie
wants to know if it is possible for her team to build a tall enough
stack to catch the frisbee, and if so, what is the maximum safety
factor of such a stack. The safety factor of a stack is the amount of
weight that can be added to the top of the stack without exceeding any
cow’s strength.

给出N头牛,每头牛有自己的高度,自身重量及承受重量。 现在从N头牛中选出一些牛来,叠成一堆。问是否可以达到一个高度为H的值。

Input The first line of input contains N and H. The next N lines of
input each describe a cow, giving its height, weight, and strength.
All are positive integers at most 1 billion.

Output If Bessie’s team can build a stack tall enough to catch the
frisbee, please output the maximum achievable safety factor for such a
stack. Otherwise output “Mark is too tall” (without the quotes).

状压dp,记录当前集合的总高和总重,枚举在最下面的牛。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
const LL oo=1e16;
LL sh[4000010],sw[4000010],H,h[25],w[25],c[25],dp[4000010],ans=-oo;
int n;
int main()
{ios::sync_with_stdio(0);cin>>n>>H;for (int i=0;i<n;i++) cin>>h[i]>>w[i]>>c[i];dp[0]=oo;for (int s=1;s<(1<<n);s++){dp[s]=-oo;for (int i=0;i<n;i++)if (s&(1<<i)){sh[s]=sh[s^(1<<i)]+h[i];sw[s]=sw[s^(1<<i)]+w[i];dp[s]=max(dp[s],min(dp[s^(1<<i)],c[i]-sw[s^(1<<i)]));}if (sh[s]>=H) ans=max(ans,dp[s]);}if (ans<0) cout<<"Mark is too tall"<<endl;else cout<<ans<<endl;
}
  相关解决方案