手套问题

来源:互联网 发布:qq企业邮箱端口 编辑:程序博客网 时间:2024/06/03 01:56

题目描述

在地下室里放着n种颜色的手套,手套分左右手,但是每种颜色的左右手手套个数不一定相同。A先生现在要出门,所以他要去地下室选手套。但是昏暗的灯光让他无法分辨手套的颜色,只能分辨出左右手。所以他会多拿一些手套,然后选出一双颜色相同的左右手手套。现在的问题是,他至少要拿多少只手套(左手加右手),才能保证一定能选出一双颜色相同的手套。
给定颜色种数n(1≤n≤13),同时给定两个长度为n的数组left,right,分别代表每种颜色左右手手套的数量。数据保证左右的手套总数均不超过26,且一定存在至少一种合法方案。
测试样例:
4,[0,7,1,6],[1,5,0,6]
**返回:10(解释:可以左手手套取2只,右手手套取8只)
思路:**
* 1:把左手套全部拿出来,右手套选出一个,即可配对
* 2:把右手套全部拿出来,左手套选出一个,即可配对
* 但是这两种方法缺乏一点考虑,1中从右手套中选出配左手套,有一种情况
* 左手套中可能有一种颜色为0,而右手套却有这种颜色,这时如果选择这个右手套
* 就不可以配对,所以总数需要1+这类右手套的个数才可成功配对,此外还有一点
* 需要考虑,就是只需要配对一个即成功,所以把左右手套都有的颜色中左手套个数
* 最少的手套数变为1,因为多了也是冗余。2中类似。
* 程序中的max = max - min + 2可以理解为
* max = max -(min - 1) + 1

import java.util.*;public class Gloves {    public int findMinimum(int n, int[] left, int[] right) {         int max1 = 0,max2 = 0;        int min1 = 27,min2 = 27;//总手套数        int i;        for(i=0;i<n;i++){            if(left[i] == 0){                max1 = max1+right[i];            }            else{                max1 = max1+left[i];            }            if(right[i] == 0){                max2 = max2+left[i];            }            else{                max2 = max2+right[i];            }            if(left[i]!=0 && right[i]!=0 && left[i]<min1){                min1 = left[i];            }            if(right[i]!=0 && left[i]!=0 && right[i]<min2){                min2 = right[i];            }        }        max1 = max1-min1+2;        max2 = max2-min2+2;        return (max1<max2)?max1:max2;    }}
0 0