1, 两个一样的杯子,分别装着同体积的茶水和牛奶,然后茶水取一瓢到牛奶杯里,搅匀后从牛奶杯里取一瓢到茶水杯里,问牛奶杯里茶水多还是茶水杯里牛奶多?(华为)
答:体积不变,是一样多。 假设茶水有1000单位,牛奶也一样是1000单位。无论他倒多少次,假设最后茶水杯里有X单位的牛奶,那么茶水杯里的茶水就是(1000-X)。所以牛奶杯里的茶水就是X单位。所以是一样多的。
2, 有10个硬币外形无差别,知道其中一个硬币重量比较轻,要在天秤上怎么样只称两次不用砝码就找出那个假的?
答:第一次:5个分为一组 找到轻的那组
第二次:在有问题那组里任意选4个 两个一组再称。
1)如天平平衡,那么没有选的那个有问题。
2)如不平衡,可以知道轻的那一边有问题,只有2个,拿起其中一个,另一边也取一个,如现在平衡,那么拿起的那一个有问题, 如不平衡没取的那个就是。
3,从1-99999之间,求出所有满足以下条件的数x:1、x是完全平方数;2、x有两位数相同。如:121=11*11,且它有两位数相同,故它满足条件。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/************************************************************************/
/*Author:phinecosDate:2009-05-20
/************************************************************************/
#include<iostream>
#include<map>
#include<string>
usingnamespacestd;
structnode
{
intvalue;
intcount;
};
boolisOk(intnum)
{
inti,tmp;
boolresult=false;
map<int,int>numMap;
//初始化
for(i=0;i<10;++i)
{
numMap[i]=0;
}
//剥离数位
while(num!=0)
{
tmp=num%10;
++numMap[tmp];
num/=10;
}
//判断是否仅有一个数位有个
intcount=0;
map<int,int>::iteratoriter;
for(iter=numMap.begin();iter!=numMap.end();++iter)
{
if(iter->second==2)
{
++count;
}
}
if(count==1)
{//仅有位出现次
result=true;
}
returnresult;
}
intmain(intargc,char*argv[])
{
for(inti=1;i<=316;++i)
{
if(isOk(i*i))
{
cout<<i*i<<endl;
}
}
return0;
}
/*Author:phinecosDate:2009-05-20
/************************************************************************/
#include<iostream>
#include<map>
#include<string>
usingnamespacestd;
structnode
{
intvalue;
intcount;
};
boolisOk(intnum)
{
inti,tmp;
boolresult=false;
map<int,int>numMap;
//初始化
for(i=0;i<10;++i)
{
numMap[i]=0;
}
//剥离数位
while(num!=0)
{
tmp=num%10;
++numMap[tmp];
num/=10;
}
//判断是否仅有一个数位有个
intcount=0;
map<int,int>::iteratoriter;
for(iter=numMap.begin();iter!=numMap.end();++iter)
{
if(iter->second==2)
{
++count;
}
}
if(count==1)
{//仅有位出现次
result=true;
}
returnresult;
}
intmain(intargc,char*argv[])
{
for(inti=1;i<=316;++i)
{
if(isOk(i*i))
{
cout<<i*i<<endl;
}
}
return0;
}
4,题目:网球中心共有100个网球场,每个单位可以来申请1到100的场地,申请的场地编号必须是连续的,如果场地已经被其他单位占用,就不能再次使用,而且单位在使用完场地后必须归还。请设计一个完整的系统。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<iostream>
#include<vector>
#include<string>
usingnamespacestd;
/************************************************************************/
/*Author:phinecosDate:2009-05-20*/
/************************************************************************/
structTennisCourt
{//网球场
intserialNum;//编号
boolbOccupied;//是否被占用
stringOwner;//占用者
};
//网球中心
classTennisCenter
{
public:
TennisCenter();
voidprint()const;
boolrequestCourts(intnum,constchar*requester,vector<int>&alloctedCourts);//请求num块场地,若分配成功,则返回分配的场地的编号
boolreturnCourts(constchar*returner,constvector<int>&alloctedCourts);//归还连续编号的场地
intgetEmpytCourts()const;
protected:
voidinit();
voidallocateCourts(intbegin,intend,constchar*requester);
boolIsValidOwner(intbegin,intend,constchar*returner);
voidfreeCourts(intbegin,intend);
private:
vector<TennisCourt>courts;//场地
intnEmptyCourt;//空余的场地
staticconstintMAX_CAPACITY=100;//场地最大数目
};
TennisCenter::TennisCenter()
{
this->init();
}
voidTennisCenter::init()
{
nEmptyCourt=MAX_CAPACITY;//空余块场地
courts.resize(MAX_CAPACITY);
for(inti=0;i<MAX_CAPACITY;++i)
{
courts[i].serialNum=i+1;
courts[i].bOccupied=false;
courts[i].Owner="";
}
}
voidTennisCenter::print()const
{
vector<TennisCourt>::const_iteratoriter;
for(iter=courts.begin();iter!=courts.end();++iter)
{
cout<<iter->serialNum<<'/t';
if(iter->bOccupied)
cout<<iter->Owner<<'/t';
cout<<endl;
}
}
voidTennisCenter::allocateCourts(intbegin,intend,constchar*requester)
{
for(inti=begin;i<end;++i)
{
courts[i].bOccupied=true;
courts[i].Owner=requester;
--this->nEmptyCourt;//剩余场地递减
}
}
boolTennisCenter::IsValidOwner(intbegin,intend,constchar*returner)
{//是否是合法拥有者
for(inti=begin;i<=end;++i)
{
if(courts[i].Owner.compare(returner)!=0)
{
returnfalse;
}
}
returntrue;
}
voidTennisCenter::freeCourts(intbegin,intend)
{
for(inti=begin;i<=end;++i)
{
courts[i].bOccupied=false;
courts[i].Owner="";
++this->nEmptyCourt;//剩余场地递增
}
}
boolTennisCenter::requestCourts(intnum,constchar*requester,vector<int>&alloctedCourts)
{//请求num块场地,若分配成功,则返回true,输出参数中保存分配的场地的编号,否则返回false
cout<<"剩余"<<this->nEmptyCourt<<"块场地"<<endl;
alloctedCourts.clear();
boolresult=false;
if(num>this->nEmptyCourt)//剩余场地不够,不需再查看
returnfalse;
//剩余场地数目够,看是否有足够连续多的场地满足用户请求
inti,j,k;
for(i=0;i<MAX_CAPACITY;++i)
{
for(j=i,k=0;j<MAX_CAPACITY&&k<num;++j,++k)
{
if(courts[j].bOccupied==true)
{//有被占用,未能连续
break;
}
}
if(k==num)
{//有连续num个空场地,分配给请求者
this->allocateCourts(i,i+num,requester);
for(k=i;k<i+num;++k)
{
alloctedCourts.push_back(k+1);
}
result=true;
break;
}
}
returnresult;
}
boolTennisCenter::returnCourts(constchar*returner,constvector<int>&alloctedCourts)
{//归还连续编号的场地
intbegin=alloctedCourts[0]-1;
intend=alloctedCourts[alloctedCourts.size()-1]-1;
if(!this->IsValidOwner(begin,end,returner))
{//非法持有者不能归还
returnfalse;
}
this->freeCourts(begin,end);
returntrue;
}
intTennisCenter::getEmpytCourts()const
{
returnthis->nEmptyCourt;
}
voidshowAllocatedCourts(constvector<int>&courts)
{
vector<int>::const_iteratoriter;
for(iter=courts.begin();iter!=courts.end();++iter)
{
cout<<*iter<<endl;
}
}
intmain(intargc,char*argv[])
{
TennisCentertennisCenter;
vector<int>allocatedCourts;
boolresult=tennisCenter.requestCourts(30,"张三",allocatedCourts);
if(result)
{
showAllocatedCourts(allocatedCourts);
}
else
{
cout<<"无足够的场地分配"<<endl;
}
cout<<"归还前:"<<tennisCenter.getEmpytCourts()<<endl;
tennisCenter.print();
tennisCenter.returnCourts("张三",allocatedCourts);
cout<<"归还后:"<<tennisCenter.getEmpytCourts()<<endl;
tennisCenter.print();
cout<<endl<<endl;
if(tennisCenter.requestCourts(60,"李四",allocatedCourts))
{
showAllocatedCourts(allocatedCourts);
}
else
{
cout<<"无足够的场地分配"<<endl;
}
cout<<endl<<endl;
cout<<"归还前:"<<tennisCenter.getEmpytCourts()<<endl;
tennisCenter.print();
tennisCenter.returnCourts("李四",allocatedCourts);
cout<<"归还后:"<<tennisCenter.getEmpytCourts()<<endl;
if(result=tennisCenter.requestCourts(20,"王五",allocatedCourts))
{
showAllocatedCourts(allocatedCourts);
}
else
{
cout<<"无足够的场地分配"<<endl;
}
cout<<"王五还未归还
."<<endl;
tennisCenter.print();
return0;
}
#include<vector>
#include<string>
usingnamespacestd;
/************************************************************************/
/*Author:phinecosDate:2009-05-20*/
/************************************************************************/
structTennisCourt
{//网球场
intserialNum;//编号
boolbOccupied;//是否被占用
stringOwner;//占用者
};
//网球中心
classTennisCenter
{
public:
TennisCenter();
voidprint()const;
boolrequestCourts(intnum,constchar*requester,vector<int>&alloctedCourts);//请求num块场地,若分配成功,则返回分配的场地的编号
boolreturnCourts(constchar*returner,constvector<int>&alloctedCourts);//归还连续编号的场地
intgetEmpytCourts()const;
protected:
voidinit();
voidallocateCourts(intbegin,intend,constchar*requester);
boolIsValidOwner(intbegin,intend,constchar*returner);
voidfreeCourts(intbegin,intend);
private:
vector<TennisCourt>courts;//场地
intnEmptyCourt;//空余的场地
staticconstintMAX_CAPACITY=100;//场地最大数目
};
TennisCenter::TennisCenter()
{
this->init();
}
voidTennisCenter::init()
{
nEmptyCourt=MAX_CAPACITY;//空余块场地
courts.resize(MAX_CAPACITY);
for(inti=0;i<MAX_CAPACITY;++i)
{
courts[i].serialNum=i+1;
courts[i].bOccupied=false;
courts[i].Owner="";
}
}
voidTennisCenter::print()const
{
vector<TennisCourt>::const_iteratoriter;
for(iter=courts.begin();iter!=courts.end();++iter)
{
cout<<iter->serialNum<<'/t';
if(iter->bOccupied)
cout<<iter->Owner<<'/t';
cout<<endl;
}
}
voidTennisCenter::allocateCourts(intbegin,intend,constchar*requester)
{
for(inti=begin;i<end;++i)
{
courts[i].bOccupied=true;
courts[i].Owner=requester;
--this->nEmptyCourt;//剩余场地递减
}
}
boolTennisCenter::IsValidOwner(intbegin,intend,constchar*returner)
{//是否是合法拥有者
for(inti=begin;i<=end;++i)
{
if(courts[i].Owner.compare(returner)!=0)
{
returnfalse;
}
}
returntrue;
}
voidTennisCenter::freeCourts(intbegin,intend)
{
for(inti=begin;i<=end;++i)
{
courts[i].bOccupied=false;
courts[i].Owner="";
++this->nEmptyCourt;//剩余场地递增
}
}
boolTennisCenter::requestCourts(intnum,constchar*requester,vector<int>&alloctedCourts)
{//请求num块场地,若分配成功,则返回true,输出参数中保存分配的场地的编号,否则返回false
cout<<"剩余"<<this->nEmptyCourt<<"块场地"<<endl;
alloctedCourts.clear();
boolresult=false;
if(num>this->nEmptyCourt)//剩余场地不够,不需再查看
returnfalse;
//剩余场地数目够,看是否有足够连续多的场地满足用户请求
inti,j,k;
for(i=0;i<MAX_CAPACITY;++i)
{
for(j=i,k=0;j<MAX_CAPACITY&&k<num;++j,++k)
{
if(courts[j].bOccupied==true)
{//有被占用,未能连续
break;
}
}
if(k==num)
{//有连续num个空场地,分配给请求者
this->allocateCourts(i,i+num,requester);
for(k=i;k<i+num;++k)
{
alloctedCourts.push_back(k+1);
}
result=true;
break;
}
}
returnresult;
}
boolTennisCenter::returnCourts(constchar*returner,constvector<int>&alloctedCourts)
{//归还连续编号的场地
intbegin=alloctedCourts[0]-1;
intend=alloctedCourts[alloctedCourts.size()-1]-1;
if(!this->IsValidOwner(begin,end,returner))
{//非法持有者不能归还
returnfalse;
}
this->freeCourts(begin,end);
returntrue;
}
intTennisCenter::getEmpytCourts()const
{
returnthis->nEmptyCourt;
}
voidshowAllocatedCourts(constvector<int>&courts)
{
vector<int>::const_iteratoriter;
for(iter=courts.begin();iter!=courts.end();++iter)
{
cout<<*iter<<endl;
}
}
intmain(intargc,char*argv[])
{
TennisCentertennisCenter;
vector<int>allocatedCourts;
boolresult=tennisCenter.requestCourts(30,"张三",allocatedCourts);
if(result)
{
showAllocatedCourts(allocatedCourts);
}
else
{
cout<<"无足够的场地分配"<<endl;
}
cout<<"归还前:"<<tennisCenter.getEmpytCourts()<<endl;
tennisCenter.print();
tennisCenter.returnCourts("张三",allocatedCourts);
cout<<"归还后:"<<tennisCenter.getEmpytCourts()<<endl;
tennisCenter.print();
cout<<endl<<endl;
if(tennisCenter.requestCourts(60,"李四",allocatedCourts))
{
showAllocatedCourts(allocatedCourts);
}
else
{
cout<<"无足够的场地分配"<<endl;
}
cout<<endl<<endl;
cout<<"归还前:"<<tennisCenter.getEmpytCourts()<<endl;
tennisCenter.print();
tennisCenter.returnCourts("李四",allocatedCourts);
cout<<"归还后:"<<tennisCenter.getEmpytCourts()<<endl;
if(result=tennisCenter.requestCourts(20,"王五",allocatedCourts))
{
showAllocatedCourts(allocatedCourts);
}
else
{
cout<<"无足够的场地分配"<<endl;
}
cout<<"王五还未归还
."<<endl;tennisCenter.print();
return0;
}
本文包含四个有趣的智力挑战题及解答,包括液体转移问题、硬币筛选法、寻找特定平方数以及网球场地管理系统的设计实现。
876

被折叠的 条评论
为什么被折叠?



