Terry's Blog

Terry's Blog

我好菜啊

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

posted on 2021-03-27 20:37:05 | under 题解 |

题解【[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:貌似这次比赛就写出来了这一道题,人傻了。