手套

2016/04/29 C和C++基础

题目描述

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

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

测试样例:

4,[0,7,1,6],[1,5,0,6]

返回:10(解释:可以左手手套取2只,右手手套取8只)

程序代码

class Gloves {
public:
    int compute(vector<int> &arr1,vector<int> &arr2,int n){
		vector<int> rzeros;
		vector<int> rs;
		for(int i=0;i<n;i++){
			if(arr1[i]==0)
				rzeros.push_back(arr2[i]);
			else{
				if(arr2[i]!=0)
					rs.push_back(arr2[i]);
			}
		}
		sort(rs.begin(),rs.end());
		int rsum=0;
		for(int i=rs.size()-1;i>=1;i--){
			rsum=rsum+rs[i];
        }
		rsum++;
		for(int i=0;i<rzeros.size();i++){
			rsum=rsum+rzeros[i];
    	}

		int lsum=1;
		vector<int> lzeros;
		for(int i=0;i<n;i++){
			if(arr2[i]==0)
				lzeros.push_back(arr1[i]);
		}
		for(int i=0;i<lzeros.size();i++){
			lsum=lsum+lzeros[i];
        }
		return lsum+rsum;
	}
    
    int findMinimum(int n, vector<int> left, vector<int> right) {
        // write code here
        int a1=compute(left,right,n);
        int a2=compute(right,left,n);
        if(a1<a2)
            return a1;
        else
            return a2;
    }
};

Search

    Post Directory