题解|拼三角
拼三角
解法:枚举,先枚举出三个,判断能否构成三角形,
1.如果为真,则判断剩下三个能否构成三角形,如果为真,则打印yes;如果为假,则重新枚举
2.如果为假,则重新枚举
3.如果枚举完了,也没有符合要求,则打印No。
但是上面这种会做很多重复的判断。我们可以先从判断能否构成三角形来进行优化:
一般,我们判断能否构成三角形——两边之和大于第三边,但是这样需要比较三次。其实我们可以用较小的两个数的和与第三个数进行比较,如果大于,则可以构成,反之则不能。这样一次判断,就满足了之前的三次判断。
所以我们可以先对数组进行排序,接着先枚举012,如果01小于2了,则就不需要枚举01和其他的数了,因为排序的原因。3肯定比2大。所以对于01来说,我们只需要判断012和345是否能否同时成立即可,如果可以,则yes,不可以枚举下一组。
下一组,枚举023,如果02小于3,则也不需要枚举45了,原因同上。所以只需要判断023和145
下一组,枚举034和125,下一组045和123
只要上面有一组成立,就yes,反之no。
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> nums(6); int main() { int t = 0; cin >> t; while (t--) { int i = 0; while (i < 6) { cin >> nums[i++]; } sort(nums.begin(), nums.end()); // 分四种情况讨论 if (nums[0] + nums[1] > nums[2] && nums[3] + nums[4] > nums[5]) cout << "Yes" << endl; else if (nums[0] + nums[2] > nums[3] && nums[1] + nums[4] > nums[5]) cout << "Yes" << endl; else if (nums[0] + nums[3] > nums[4] && nums[1] + nums[2] > nums[5]) cout << "Yes" << endl; else if (nums[0] + nums[4] > nums[5] && nums[1] + nums[2] > nums[3]) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }