/*
在地下室里放着n种颜色的手套,手套分左右手,但是每种颜色的左右手手套个数不一定相同。A先生现在要出门,所以他要去地下室选手套。但是昏暗的灯光让他无法分辨手套的颜色,只能分辨出左右手。所以他会多拿一些手套,然后选出一双颜色相同的左右手手套。现在的问题是,他至少要拿多少只手套(左手加右手),才能保证一定能选出一双颜色相同的手套。
给定颜色种数n(1≤n≤13),同时给定两个长度为n的数组left,right,分别代表每种颜色左右手手套的数量。数据保证左右的手套总数均不超过26,且一定存在至少一种合法方案。
测试样例:
4,[0,7,1,6],[1,5,0,6]
返回:10(解释:可以左手手套取2只,右手手套取8只)
理解题意:拿多少双才一定会匹配到相同颜色的一双手套了?
此时我们只需要先在左手或右手拿能覆盖所有颜色的手套数,
然后再随便拿另外一只手的手套1个就一定能匹配成功(因另外一只手已覆盖所有颜色)
例外:如果有一种颜色的手套它的左手或右手没有,那么此种颜色的手套全拿才能保证题意,
即最差情况,即该人拿手套时恰好拿了该颜色的所有手套
那么如何保证全覆盖了,例如 :有一组数1 2 3 4 5。
存在一个数保证在该组数中任意四个数的和都不会大于该数,这个数是多大?
1+2+3+4+5-1+1=15;
即sum(a1+a2+......+an)-min(a1,a2,....an)+1;
*/
class Gloves {
public:
int findMinimum(int n, vector<int> left, vector<int> right) {
// write code here
int leftsum=0,rightsum=0;
int leftmin=INT_MAX,rightmin=INT_MAX;
int sum=0;
for(int i=0;i<n;++i){
//若该种颜色有为零的手套则全拿
if((left[i]*right[i])==0){
sum+=left[i]+right[i];
}else{
leftsum+=left[i];
rightsum+=right[i];
leftmin=min(left[i],leftmin);
rightmin=min(right[i],rightmin);
}
}
//sum一只手颜色为0的手套数,1另外一只手随意取得一只手套;
return sum+min(leftsum-leftmin+1,rightsum-rightmin+1)+1;
}
};
手套
猜你喜欢
转载自blog.csdn.net/weixin_45295598/article/details/104802769
今日推荐
周排行