关闭

【笔试】挑手套

80人阅读 评论(0) 收藏 举报
分类:

(编程题)
在地下室里放着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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26553次
    • 积分:1129
    • 等级:
    • 排名:千里之外
    • 原创:86篇
    • 转载:2篇
    • 译文:0篇
    • 评论:9条
    最新评论