手套問題

題目描述

在地下室裏放着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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章