首页 > 其他 > 详细

NC209583-牛牛与三角形

时间:2021-02-03 14:07:18      阅读:49      评论:0      收藏:0      [点我收藏+]

题目链接:https://ac.nowcoder.com/acm/problem/209583

题意:给定n个数,n个数中能构成的最大三角形周长值减去最小三角形周长值

思路:排序后,最小三角形的两个大边相邻,则二分第三个边,最大的三角形周长一定是相邻三个数,则逆序枚举找最大三角形周长。

构成三角形的条件:两个小边和大于最大边

反思:
lower_bound(a.begin(),a.end(),num);二分查找递增数组,返回大于num的数的下标地址,否则返回a.end();
upper_bound(a.begin(),a.end(),num);区别是 返回大于等于num的数组下标地址。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回在所有合法的三角形的组成中,最大的三角形的周长减去最小的三角形的周长的值
     * @param n int整型 代表题目中的n
     * @param a int整型vector 代表n个数的大小
     * @return int整型
     */
    int formTriangle(int n, vector<int>& a) {
        // write code here
        sort(a.begin(),a.end());
        int maxans=0,minans=0;
        for(int i=n-3;i>=0;i--){
            if(a[i]+a[i+1]>a[i+2]&&a[i+2]-a[i+1]<a[i]){
               maxans=a[i]+a[i+1]+a[i+2];
                break;
        }
    }
        for(int i=1;i+1<n;i++){
            int t=upper_bound(a.begin(),a.begin()+i,a[i+1]-a[i])-a.begin();
            if(a[t]+a[i]>a[i+1]&&t<i){
                minans=a[t]+a[i]+a[i+1];
                break;
        }
        }
            return maxans-minans;
    }
};
/*
5,[3,2,6,3,7]
8
1,[1,2,4,4]
1
*/

NC209583-牛牛与三角形

原文:https://www.cnblogs.com/abestxun/p/14366396.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!