手套

/*
在地下室里放着n种颜色的手套,手套分左右手,但是每种颜色的左右手手套个数不一定相同。A先生现在要出门,所以他要去地下室选手套。但是昏暗的灯光让他无法分辨手套的颜色,只能分辨出左右手。所以他会多拿一些手套,然后选出一双颜色相同的左右手手套。现在的问题是,他至少要拿多少只手套(左手加右手),才能保证一定能选出一双颜色相同的手套。

给定颜色种数n(1≤n≤13),同时给定两个长度为n的数组left,right,分别代表每种颜色左右手手套的数量。数据保证左右的手套总数均不超过26,且一定存在至少一种合法方案。

测试样例:
4,[0,7,1,6],[1,5,0,6]
返回:10(解释:可以左手手套取2只,右手手套取8只)
理解题意:拿多少双才一定会匹配到相同颜色的一双手套了?
此时我们只需要先在左手或右手拿能覆盖所有颜色的手套数,
然后再随便拿另外一只手的手套1个就一定能匹配成功(因另外一只手已覆盖所有颜色)
例外:如果有一种颜色的手套它的左手或右手没有,那么此种颜色的手套全拿才能保证题意,
即最差情况,即该人拿手套时恰好拿了该颜色的所有手套

那么如何保证全覆盖了,例如 :有一组数1 2 3 4 5。
存在一个数保证在该组数中任意四个数的和都不会大于该数,这个数是多大?
1+2+3+4+5-1+1=15;
即sum(a1+a2+......+an)-min(a1,a2,....an)+1;
*/
class Gloves {
    
    
public:
    int findMinimum(int n, vector<int> left, vector<int> right) {
    
    
        // write code here
        int leftsum=0,rightsum=0;
        int leftmin=INT_MAX,rightmin=INT_MAX;
        int sum=0;
        for(int i=0;i<n;++i){
    
    
            //若该种颜色有为零的手套则全拿
            if((left[i]*right[i])==0){
    
    
                sum+=left[i]+right[i];
            }else{
    
    
                leftsum+=left[i];
                rightsum+=right[i];
                leftmin=min(left[i],leftmin);
                rightmin=min(right[i],rightmin);
            }
        }
        //sum一只手颜色为0的手套数,1另外一只手随意取得一只手套;
        return sum+min(leftsum-leftmin+1,rightsum-rightmin+1)+1;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_45295598/article/details/104802769