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; } };