【笔试】挑手套

(编程题)
在地下室里放着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;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31839479/article/details/52347026
个人分类: 笔试
上一篇【笔试】拉灯开关
下一篇【黑客大赛】前缀真前缀
想对作者说点什么? 我来说一句

冒险岛鼠标指针

2014年05月09日 123KB 下载

没有更多推荐了,返回首页

关闭
关闭