列表

详情


OR57. 手套

描述

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

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

测试样例:
4,[0,7,1,6],[1,5,0,6]
返回:10(解释:可以左手手套取2只,右手手套取8只)

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 1ms, 内存消耗: 492KB, 提交时间: 2017-06-22

class Gloves {
public:
    int findMinimum(int n, vector<int> left, vector<int> right) {
		// write code here
		int a = 0;
		int b = 0;
		int left_min = 26;
		int right_min = 26;
		int out = 0;
		int sum_left = 0;
		int sum_right = 0;
		for (int i = 0; i<n; i++)
		{
			if (left[i] == 0)

				sum_right += right[i];

			else if(right[i]!=0)
			{
				b += right[i];
				right_min = min(right_min, right[i]);

			}
			if (right[i] == 0)
				sum_left += left[i];
			else if(left[i]!=0)
			{
				a += left[i];
				left_min = min(left_min, left[i]);

			}
		}
		if (a - left_min +1 >b - right_min + 1)
		{

			out = b - right_min + 1 + sum_right + sum_left + 1;
		}
		else
		{
			out = a - left_min + 1 + sum_left + sum_right + 1;
		}
		return out;
	}
};

C++ 解法, 执行用时: 1ms, 内存消耗: 496KB, 提交时间: 2017-08-01

class Gloves {
public:
    int findMinimum(int n, vector<int> left, vector<int> right) {
        // write code here
        int sum = 0;
        int lmin = INT_MAX;
        int rmin = INT_MAX;
        int lsum = 0;
        int rsum = 0;
        for (int i = 0; i < n; ++i){
            if (left[i]*right[i] == 0){
                sum += left[i]+right[i];
            }
            else {
                lsum += left[i];
                rsum += right[i];
                lmin = min(lmin,left[i]);
                rmin = min(rmin,right[i]);
            }
        }
        
        sum += min(lsum-lmin+1,rsum-rmin+1)+1;
        
        return sum;
    }
};

上一题