学员交流

100分解法

运用贪心思想,一个组最少两个人,我们尽可能让每个组都两个人,多的人再随便分配给已有的小组即可。所以答案就是sum/2,sum为所有学员总人数。但是有可能一个学院的人过多,所有其他学院的人都都和这个学院的人一一结组后这个学院还剩下>=2个人,这种情况下答案无法到达sum/2,比如[1,100],只能结成一个小组。所以要在sum-最大值和sum/2中取一个min即为我们要的答案。

解法一:时间复杂度o(nlogn),空间复杂度o(1)。

class Solution {
public:
    /**
     * 返回最多能结成多少个学习小组
     * @param arr int整型vector 
     * @return long长整型
     */
    long long numberofgroup(vector<int>& arr) {
        // write code here
        int n=arr.size();
        sort(arr.begin(),arr.end());
        long long sum=0;
        for(int i=0;i<n-1;i++)
        {
            sum+=arr[i];
        }
        sum=min(sum,(arr[n-1]+sum)/2);
        return sum;
    }
};

解法二:时间复杂度o(n),空间复杂度o(1)。

class Solution {
public:
    /**
     * 返回最多能结成多少个学习小组
     * @param arr int整型vector 
     * @return long长整型
     */
    long long numberofgroup(vector<int>& arr) {
        // write code here
        int n=arr.size();
        long long maxn=0;
        long long sum=0;
        for(int i=0;i<n;i++)
        {
            maxn=max(maxn,(long long)arr[i]);
            sum+=arr[i];
        }
        sum=min(sum-maxn,sum/2);
        return sum;
    }
};
全部评论

相关推荐

05-23 19:02
吉林大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务