手套---牛客网

手套_牛客题霸_牛客网 (nowcoder.com)

 

class Gloves {
  public:
    int findMinimum(int n, vector<int> left, vector<int> right) {
        int sum=0;
        int left_sum = 0, left_min = INT_MAX;
        int right_sum = 0, right_min = INT_MAX;

        for(int i=0;i<n;i++)
        {
            if(left[i]*right[i]==0)//如果这其中有0 就是没有匹配的手套 不用纳入计算
            {
                sum+=left[i]+right[i];//加上这些没有匹配的剩余手套 保证把他们全拿到后,再拿一个,就是保证至少能拿到一个能匹配的手套
            }
            else
            {
                left_sum+=left[i];//左边的全部值
                left_min=left_min<left[i]?left_min:left[i];//计算左边的最小值 不包括0
                right_sum+=right[i];//右边的全部值
                right_min=right_min<right[i]?right_min:right[i];//计算右边的最小值 不包括0
            }
        }
        //sum为不能匹配的手套个数  加上某一边能全部覆盖所有手套,并且为最小值. 最后加上另一变的随便一个手套 则为最小值(记住 sum已经排除掉不能匹配的所有手套 所以再拿一个必定拿到能匹配的手套)
        //
        return sum+min(left_sum-left_min+1,right_sum-right_min+1)+1;
    }
};

left[i] 和right[i] 是匹配的数值 0 和 1 左边0个 右边1个

因为数据中有0这种数值 说明有不能匹配的手套。所以这些手套必须加上 避免没有全拿时  拿到了不匹配的手套。

思路  :拿到左边或者右边能覆盖的值 比较左边和右边哪个小 选出来后 选另一边的一只即可 (再加上那些容错率的不匹配的手套,提高容错率,保证最后另一边拿的一只必定是能匹配的手套)

和拿一边的全部再拿另一边的一只很像。 只不过此题要计算两边中一边能覆盖的最小值 加上不能匹配的容错 再拿另一边的一只

 

扩展  要计算能覆盖某一组数据 并且是最小值的公式: 总和-最小值+1

例子[0,7,1,6],[4,5,0,6]
左边:14-1+1=14 :也就是必须拿完才能全部覆盖 总和就是最小值
右边: 15-4+1=12:随便拿12个即可覆盖所有数值
posted @ 2022-10-03 15:33  lemon-Breeze  阅读(16)  评论(0编辑  收藏  举报