1 条题解
-
0
自动搬运
来自洛谷,原作者为

lzqy_
生而绚烂,璀璨如花。搬运于
2025-08-24 22:30:11,当前版本为作者最后更新于2021-03-27 20:16:23,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
这一道题做法是分类讨论。
假设 ,那么就有以下结论:
● 等于
很明显,一刀都不用切,全部给 就可以了,切零刀。
● 有且仅有 等于
●
在这种情况下,分出两半分别给 即可,切一刀。
●
在这种情况下,切一刀肯定是不行的。但是,容易证明,切两刀可以将蛋糕分成任意比例的两份。因此切两刀。
● 且 ( 同理)
可以切两刀,分成的四份中,取任意相同的两份给 ,剩下相同的两份给 即可(按照 的结论推出)
● 且
可以切两刀,分成的四份中,取两份不同的给 ,剩下不同的两份给 便可以满足 ;依然按照 的结论得到,上述情况可以成立。
● 否则
切三刀。根据 的结论容易扩展得,切三刀可以分成任意三份的比例。
容易证明,切两刀可以将蛋糕分成任意比例的两份。
对于这一段的证明如下:
设圆的面积为 ,切两刀得到如下:

由于这两道是随意切的,所以 可以取到 的所有值。因此,同样颜色的扇形面积之和也可以取到 的所有值。
代码如下:
#include<bits/stdc++.h> using namespace std; inline int read() { register int x=0; register char c=getchar(); for(;!(c>='0'&&c<='9');c=getchar()); for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+c-'0'; return x; } int t,a[3]; int main() { t=read(); while(t--) { a[0]=read(),a[1]=read(),a[2]=read(); //读到数组里面利于排序 sort(a,a+3); //以下是上文的分类讨论: if(a[0]==0&&a[1]==0) { printf("0\n"); continue; } if(a[0]==0) { if(a[1]==a[2]) printf("1\n"); else printf("2\n"); continue; } if(a[0]==a[1]||a[1]==a[2]) { printf("2\n"); continue; } if(a[0]+a[1]==a[2]) { printf("2\n"); continue; } printf("3\n"); } return 0; }
- 1
信息
- ID
- 6637
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者