题解【[NOI Online 2021 入门组] 切蛋糕(民间数据)】

TRZ_2007

2021-03-27 20:37:05

Solution

**[题解【[NOI Online 2021 入门组] 切蛋糕(民间数据)】](https://www.luogu.com.cn/problem/P7471)** # Solution 这道题目其实是一个数学题…… 考虑分类讨论。 首先先把读入的数字排序以便于处理。 - 1: 两个数字都是 ``0`` : 不用切了全部都是第三个人的 - 2:一个数字是 ``0``:继续分类,如果两个数字相同那么直接对半开(切一刀),否则对半开之后再切一刀必定可以达成目的(因为可以切任意的圆周角) - 3: 都不是 ``0`` :继续分类,如果有两个数字相同那么只需要切两刀(先对半开然后再切一刀必定可以找到**两对**面积相等的部分);如果小的两个面积之和等于大的,也只需要切两刀(先对半开然后再一个半圆中切出这两个小的面积),否则就切三刀(先切两刀写出最小的,然后对剩下来的大扇形进行切割,一定可以切出来) 然后……这道题目就结束了,如果看不懂可以自己画一个图理解一下。 # Code ``` #include <bits/stdc++.h> using namespace std; #define gc getchar inline int read() { int c = gc(), t = 1, n = 0; while(isspace(c)) { c = gc(); } if(c == '-') { t = -1, c = gc(); } while(isdigit(c)) { n = n * 10 + c - '0', c = gc(); } return n * t; } #undef gc int T,a,b,c,t[3],dk; inline void solve() { t[0] = read(); t[1] = read(); t[2] = read(); sort(t,t + 3); a = t[0]; b = t[1]; c = t[2]; if(a == 0 && b == 0) { puts("0"); return; } if(a == 0) { dk = __gcd(b,c); b /= dk; c /= dk; if(b == c) { puts("1"); return; } else { puts("2"); return; } return; } dk = __gcd(a,__gcd(b,c)); a /= dk; b /= dk; c /= dk; if(a == b || b == c || c == a) { puts("2"); return; } if(a + b == c) { puts("2"); return; } puts("3"); } void _file() { freopen("cake.in","r",stdin); freopen("cake.out","w",stdout); } int main() { // _file(); T = read(); while(T--) solve(); return 0; } ``` PS:貌似这次比赛就写出来了这一道题,人傻了。