P9713 「QFOI R1」抱抱 题解
P9713 「QFOI R1」抱抱 题解
Sol
前置知识:长方体体积公式:。
我们知道,切割掉 的部分就是把 减去 ,切割掉 的部分就是把 减去 ,切割掉 的部分就是把 减去 。但是这里要考虑重合的部分,比如切掉 的部分再切掉 的部分,那么第二次 只能减去 。我们可以定义一个存 最大值的变量 ,如果 ,那么就减去 ,并把 。每一次切割完后输出新的 ,, 相乘的结果即可。还有,一定要开 long long
!
code
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
using ll = long long;
const int kMaxN = -1, kInf = (((1 << 30) - 1) << 1) + 1;
ll a, b, c, m, op, k, maxa1, maxa2, maxa3;
// maxa1 存切割 a 时的 k,maxa2 存切割 b 时的 k,maxa3 存切割 c 时的 k
int main() {
cin >> a >> b >> c >> m; // 输入 a, b, c, m
for (; m; -- m) { // 循环,等于 while (m --)
cin >> op >> k; // 输入 op, k
if (op == 1) { // 如果切割 a
(maxa1 < k) && (a = max(a - (k - maxa1), 0ll)) && (maxa1 = k);
// 如果没有重合的部分 > 0(k - maxa1),那么把 a 减去重合的部分(这里取 max 是因为不放心)并更新 maxa1
} else if (op == 2) {
(maxa2 < k) && (b = max(b - (k - maxa2), 0ll)) && (maxa2 = k);
// 如果没有重合的部分 > 0(k - maxa2),那么把 b 减去重合的部分(这里取 max 是因为不放心)并更新 maxa2
} else {
(maxa3 < k) && (c = max(c - (k - maxa3), 0ll)) && (maxa3 = k);
// 如果没有重合的部分 > 0(k - maxa3),那么把 c 减去重合的部分(这里取 max 是因为不放心)并更新 maxa3
}
cout << a * b * c << '\n'; // 输出 a * b * c(体积公式)
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】