【正经题解】Guard Mark
2024-03-18 14:08:37
发布于:浙江
1阅读
0回复
0点赞
枚举所有的牛塔组合,使用位运算来表示不同的组合状态。对于每个组合状态,遍历每头牛,计算其叠加高度和最大安全系数。
如果叠加高度小于飞盘高度,则跳过该组合,因为无法接住飞盘。
更新最大安全系数,取当前组合的最小耐力值减去已经叠加的重量的最小值。
输出最终的最大安全系数,如果不存在有效的牛塔组合,则输出 。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<climits> // 包含头文件以使用正无穷大值LLONG_MAX
#define ll long long
using namespace std;
const ll N=21;
ll n,T,sh,maxs,ans,w,MS;
struct node {
ll h, w, s;
} a[N];
bool cmp(node x, node y) {
return x.s + x.w > y.s + y.w;
}
int main() {
scanf("%lld%lld", &n, &T);
for (ll i = 1; i <= n; i++)
scanf("%lld%lld%lld", &a[i].h, &a[i].w, &a[i].s);
sort(a + 1, a + 1 + n, cmp);
MS = 1 << n;
ans = -1;
for (ll i = 0; i < MS; i++) {
sh = w = 0;
maxs = LLONG_MAX; // 使用正无穷大值表示初始的最大安全系数
for (ll j = n; j >= 1; j--)
if ((i >> (j - 1)) & 1) {
sh += a[j].h;
maxs = min(maxs, a[j].s - w);
w += a[j].w;
}
if (sh < T)
continue;
ans = max(maxs, ans);
}
if (ans < 0)
printf("Mark is too tall");
else
printf("%lld", ans);
}
这里空空如也
有帮助,赞一个