ACGO挑战赛#21 第一题题目题解
2025-08-19 20:24:11
发布于:江苏
T1.午枫的切蛋糕
题目大意
小枫需将蛋糕平均分给 n+1 个人(自己 +n个朋友),每一刀只能沿半径或直径切。要求计算最少需要切多少刀。
解题思路
切法 | 每刀效果 | 总块数规律(k 刀时) | 适用场景 |
---|---|---|---|
沿直径切 | 每刀必穿过圆心,将蛋糕分成对称的 2 块 | 总块数 = 2k(k 为直径刀数) | 最终需要的块数是偶数时 |
沿半径切 | 每刀从边缘到圆心,不穿过其他半径(需均匀分布) | 总块数 = k(k 为半径刀数) | 最终需要的块数是任意正整数时 |
解题步骤(分情况讨论)
设总人数为 m = n + 1(需分成 m 块),最少刀数为 ans:
1.当 m = 1 时(n=0,只有小枫自己):无需切蛋糕,ans = 0。
2.当 m 是偶数时:优先用直径切,每刀得 2 块,最少刀数 ans = m / 2(例如样例 1:m=6,6/2=3 刀)。
3.当 m 是奇数且 m > 1 时:无法用直径切(直径切只能得偶数块),必须用半径切,每刀得 1 块,最少刀数 ans = m(例如样例 2:m=5,需 5 刀)。
易错点
1.混淆 “人数” 和 “块数”:直接用 n 计算,忘记总块数是 n+1(如 n=5 时,不是分 5 块,而是分 6 块)。
2.忽略 m=1 的特殊情况:当 n=0 时,无需切刀,若直接套用 “奇数公式” 会错误输出 1。
3.错误选择切法:对奇数块数尝试用直径切(如 m=5,试图用 2 刀直径 + 1 刀半径,实际无法均分),忽略半径切是唯一均分奇数块的方式。
AC代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
n++;
if (n == 1) {
cout << 0;
return 0;
}
if (n % 2 == 1) {
cout << n;
}else {
cout << n / 2;
}
return 0;
}
这里空空如也
有帮助,赞一个