【笔试】挑手套

来源:互联网 发布:腾讯网络大电影分账 编辑:程序博客网 时间:2024/04/29 01:52

(编程题)
在地下室里放着n种颜色的手套,手套分左右手,但是每种颜色的左右手手套个数不一定相同。A先生现在要出门,所以他要去地下室选手套。但是昏暗的灯光让他无法分辨手套的颜色,只能分辨出左右手。所以他会多拿一些手套,然后选出一双颜色相同的左右手手套。现在的问题是,他至少要拿多少只手套(左手加右手),才能保证一定能选出一双颜色相同的手套。
给定颜色种数n(1≤n≤13),同时给定两个长度为n的数组left,right,分别代表每种颜色左右手手套的数量。数据保证左右的手套总数均不超过26,且一定存在至少一种合法方案。
测试样例:
4,[0,7,1,6],[1,5,0,6]
返回:10(解释:可以左手手套取2只,右手手套取8只)

#include <iostream>#include <algorithm>#include <vector>using namespace std;int main(){int n;/////n种颜色的手套while(cin>>n){vector<int>iVecLeft;vector<int>iVecRight;////////得到左手的数组char ch;cin>>ch;for(int i = 0;i < 2*n+1;i++){if(i%2 == 0){char ch;cin>>ch;}else{int iNum;cin>>iNum;iVecLeft.push_back(iNum);}}/ar ch;cin>>ch;////////得到右手的数组for(int i = 0;i < 2*n+1;i++){if(i%2 == 0){char ch;cin>>ch;}else{int iNum;cin>>iNum;iVecRight.push_back(iNum);}}/*for(int i = 0;i < n;i++){int iNum;cin>>iNum;iVecLeft.push_back(iNum);}for(int i = 0;i < n;i++){int iNum;cin>>iNum;iVecRight.push_back(iNum);}*////////////判断左手手套的情况:最少需要多少int sumLeft = 0;for(int i = 0; i < iVecLeft.size();i++){if(iVecLeft[i] != 0 && iVecRight[i] == 0){sumLeft += iVecLeft[i];}}sumLeft += 1;///////////////右手手套情况:最少需要多少int sumRight = 0;vector<int>::iterator it;it = max_element(iVecRight.begin(),iVecRight.end());sumRight += *it;for(vector<int>::iterator it1 = iVecRight.begin();it1 != iVecRight.end();it1++){if(it != it1){if(*it1 !=0 && iVecLeft[it1 - iVecRight.begin()] == 0){sumRight += *it1;}}}sumRight += 1;////////////总共最少的情况:两个都最小int sum = sumLeft + sumRight;cout<<sum<<"(解释:可以左手手套取"<<sumLeft<<"只,右手手套取"<<sumRight<<"只)"<<endl;}system("pause");return 0;}
0 0
原创粉丝点击