题解【[NOI Online 2021 入门组] 切蛋糕(民间数据)】
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:貌似这次比赛就写出来了这一道题,人傻了。