题目描述
在地下室里放着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;
}
};