第一次写题解博客,写的不好还请见谅~
说下我的思路:
将一组三个葡萄数想像成三条线段,如果能构成三角形(符合两短相加大于长),则三个人一人吃掉相邻两条边的一半就可以;如果不能构成三角形(即有一超长边),那么要把超长边平分给两个人吃,相当于折断长边,现在有4条边肯定能构成四边形,那么有两种情况:
- 两个人吃完长边后不再吃短边,第三人吃完短边也没有超出另两个人;
- 两人吃完长边后,如果不帮第三人吃两个短边,会使第三人吃的超过2人。
第一种情况的输出就是长边的1/2;第二种情况则与三角形情况相同,需要所有人均分。
因此,综合来看只有两种情况:所有人平分,或者其中两人平分最多的那种葡萄。这两个哪个大,输出哪个。
下面是我的代码,5ms过,412K空间占用(另外奇怪的是我之前用双for循环的完整冒泡时,时间才4ms。。。)
#include <iostream> #include <cmath> using namespace std; void sort(long list[3]) // 手动冒泡排序 { if (list[0]<list[1]) swap(list[0],list[1]); if (list[0]<list[2]) swap(list[0],list[2]); if (list[1]<list[2]) swap(list[1],list[2]); } int main() { int n; long l[3], sum; cin >> n; for (int i = 0; i < n; i++) { cin >> l[0] >> l[1] >> l[2]; sort(l); sum = l[0] + l[1] + l[2]; cout << max((sum + 2) / 3, (l[0] + 1) / 2) << endl;//加2与加1是为上取整 } }