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,且它有两位数相同,故它满足条件。
/*
**********************************************************************
*/
/* Author:phinecos Date:2009-05-20
/*********************************************************************** */
#include < iostream >
#include < map >
#include < string >
using namespace std;
struct node
{
int value;
int count;
};
bool isOk( int num)
{
int i,tmp;
bool result = false ;
map < int , int > numMap;
// 初始化
for (i = 0 ; i < 10 ; ++ i)
{
numMap[i] = 0 ;
}
// 剥离数位
while (num != 0 )
{
tmp = num % 10 ;
++ numMap[tmp];
num /= 10 ;
}
// 判断是否仅有一个数位有个
int count = 0 ;
map < int , int > ::iterator iter;
for (iter = numMap.begin(); iter != numMap.end(); ++ iter)
{
if (iter -> second == 2 )
{
++ count;
}
}
if (count == 1 )
{ // 仅有位出现次
result = true ;
}
return result;
}
int main( int argc, char * argv[])
{
for ( int i = 1 ; i <= 316 ; ++ i)
{
if (isOk(i * i))
{
cout << i * i << endl;
}
}
return 0 ;
}
/* Author:phinecos Date:2009-05-20
/*********************************************************************** */
#include < iostream >
#include < map >
#include < string >
using namespace std;
struct node
{
int value;
int count;
};
bool isOk( int num)
{
int i,tmp;
bool result = false ;
map < int , int > numMap;
// 初始化
for (i = 0 ; i < 10 ; ++ i)
{
numMap[i] = 0 ;
}
// 剥离数位
while (num != 0 )
{
tmp = num % 10 ;
++ numMap[tmp];
num /= 10 ;
}
// 判断是否仅有一个数位有个
int count = 0 ;
map < int , int > ::iterator iter;
for (iter = numMap.begin(); iter != numMap.end(); ++ iter)
{
if (iter -> second == 2 )
{
++ count;
}
}
if (count == 1 )
{ // 仅有位出现次
result = true ;
}
return result;
}
int main( int argc, char * argv[])
{
for ( int i = 1 ; i <= 316 ; ++ i)
{
if (isOk(i * i))
{
cout << i * i << endl;
}
}
return 0 ;
}
4,题目:网球中心共有100个网球场,每个单位可以来申请1到100的场地,申请的场地编号必须是连续的,如果场地已经被其他单位占用,就不能再次使用,而且单位在使用完场地后必须归还。请设计一个完整的系统。
#include
<
iostream
>
#include < vector >
#include < string >
using namespace std;
/* ********************************************************************** */
/* Author:phinecos Date:2009-05-20 */
/* ********************************************************************** */
struct TennisCourt
{ // 网球场
int serialNum; // 编号
bool bOccupied; // 是否被占用
string Owner; // 占用者
};
// 网球中心
class TennisCenter
{
public :
TennisCenter();
void print() const ;
bool requestCourts( int num, const char * requester,vector < int >& alloctedCourts); // 请求num块场地,若分配成功,则返回分配的场地的编号
bool returnCourts( const char * returner, const vector < int >& alloctedCourts); // 归还连续编号的场地
int getEmpytCourts() const ;
protected :
void init();
void allocateCourts( int begin, int end, const char * requester);
bool IsValidOwner( int begin, int end, const char * returner);
void freeCourts( int begin, int end);
private :
vector < TennisCourt > courts; // 场地
int nEmptyCourt; // 空余的场地
static const int MAX_CAPACITY = 100 ; // 场地最大数目
};
TennisCenter::TennisCenter()
{
this -> init();
}
void TennisCenter::init()
{
nEmptyCourt = MAX_CAPACITY; // 空余块场地
courts.resize(MAX_CAPACITY);
for ( int i = 0 ; i < MAX_CAPACITY; ++ i)
{
courts[i].serialNum = i + 1 ;
courts[i].bOccupied = false ;
courts[i].Owner = "" ;
}
}
void TennisCenter::print() const
{
vector < TennisCourt > ::const_iterator iter;
for (iter = courts.begin(); iter != courts.end(); ++ iter)
{
cout << iter -> serialNum << ' \t ' ;
if (iter -> bOccupied)
cout << iter -> Owner << ' \t ' ;
cout << endl;
}
}
void TennisCenter::allocateCourts( int begin, int end, const char * requester)
{
for ( int i = begin;i < end; ++ i)
{
courts[i].bOccupied = true ;
courts[i].Owner = requester;
-- this -> nEmptyCourt; // 剩余场地递减
}
}
bool TennisCenter::IsValidOwner( int begin, int end, const char * returner)
{ // 是否是合法拥有者
for ( int i = begin;i <= end; ++ i)
{
if (courts[i].Owner.compare(returner) != 0 )
{
return false ;
}
}
return true ;
}
void TennisCenter::freeCourts( int begin, int end)
{
for ( int i = begin;i <= end; ++ i)
{
courts[i].bOccupied = false ;
courts[i].Owner = "" ;
++ this -> nEmptyCourt; // 剩余场地递增
}
}
bool TennisCenter::requestCourts( int num, const char * requester, vector < int >& alloctedCourts)
{ // 请求num块场地,若分配成功,则返回true,输出参数中保存分配的场地的编号,否则返回false
cout << " 剩余 " << this -> nEmptyCourt << " 块场地 " << endl;
alloctedCourts.clear();
bool result = false ;
if (num > this -> nEmptyCourt) // 剩余场地不够,不需再查看
return false ;
// 剩余场地数目够,看是否有足够连续多的场地满足用户请求
int i,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 ;
}
}
return result;
}
bool TennisCenter::returnCourts( const char * returner, const vector < int >& alloctedCourts)
{ // 归还连续编号的场地
int begin = alloctedCourts[ 0 ] - 1 ;
int end = alloctedCourts[alloctedCourts.size() - 1 ] - 1 ;
if ( ! this -> IsValidOwner(begin, end, returner))
{ // 非法持有者不能归还
return false ;
}
this -> freeCourts(begin, end);
return true ;
}
int TennisCenter::getEmpytCourts() const
{
return this -> nEmptyCourt;
}
void showAllocatedCourts( const vector < int >& courts)
{
vector < int > ::const_iterator iter;
for (iter = courts.begin(); iter != courts.end(); ++ iter)
{
cout << * iter << endl;
}
}
int main( int argc, char * argv[])
{
TennisCenter tennisCenter;
vector < int > allocatedCourts;
bool result = 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();
return 0 ;
}
#include < vector >
#include < string >
using namespace std;
/* ********************************************************************** */
/* Author:phinecos Date:2009-05-20 */
/* ********************************************************************** */
struct TennisCourt
{ // 网球场
int serialNum; // 编号
bool bOccupied; // 是否被占用
string Owner; // 占用者
};
// 网球中心
class TennisCenter
{
public :
TennisCenter();
void print() const ;
bool requestCourts( int num, const char * requester,vector < int >& alloctedCourts); // 请求num块场地,若分配成功,则返回分配的场地的编号
bool returnCourts( const char * returner, const vector < int >& alloctedCourts); // 归还连续编号的场地
int getEmpytCourts() const ;
protected :
void init();
void allocateCourts( int begin, int end, const char * requester);
bool IsValidOwner( int begin, int end, const char * returner);
void freeCourts( int begin, int end);
private :
vector < TennisCourt > courts; // 场地
int nEmptyCourt; // 空余的场地
static const int MAX_CAPACITY = 100 ; // 场地最大数目
};
TennisCenter::TennisCenter()
{
this -> init();
}
void TennisCenter::init()
{
nEmptyCourt = MAX_CAPACITY; // 空余块场地
courts.resize(MAX_CAPACITY);
for ( int i = 0 ; i < MAX_CAPACITY; ++ i)
{
courts[i].serialNum = i + 1 ;
courts[i].bOccupied = false ;
courts[i].Owner = "" ;
}
}
void TennisCenter::print() const
{
vector < TennisCourt > ::const_iterator iter;
for (iter = courts.begin(); iter != courts.end(); ++ iter)
{
cout << iter -> serialNum << ' \t ' ;
if (iter -> bOccupied)
cout << iter -> Owner << ' \t ' ;
cout << endl;
}
}
void TennisCenter::allocateCourts( int begin, int end, const char * requester)
{
for ( int i = begin;i < end; ++ i)
{
courts[i].bOccupied = true ;
courts[i].Owner = requester;
-- this -> nEmptyCourt; // 剩余场地递减
}
}
bool TennisCenter::IsValidOwner( int begin, int end, const char * returner)
{ // 是否是合法拥有者
for ( int i = begin;i <= end; ++ i)
{
if (courts[i].Owner.compare(returner) != 0 )
{
return false ;
}
}
return true ;
}
void TennisCenter::freeCourts( int begin, int end)
{
for ( int i = begin;i <= end; ++ i)
{
courts[i].bOccupied = false ;
courts[i].Owner = "" ;
++ this -> nEmptyCourt; // 剩余场地递增
}
}
bool TennisCenter::requestCourts( int num, const char * requester, vector < int >& alloctedCourts)
{ // 请求num块场地,若分配成功,则返回true,输出参数中保存分配的场地的编号,否则返回false
cout << " 剩余 " << this -> nEmptyCourt << " 块场地 " << endl;
alloctedCourts.clear();
bool result = false ;
if (num > this -> nEmptyCourt) // 剩余场地不够,不需再查看
return false ;
// 剩余场地数目够,看是否有足够连续多的场地满足用户请求
int i,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 ;
}
}
return result;
}
bool TennisCenter::returnCourts( const char * returner, const vector < int >& alloctedCourts)
{ // 归还连续编号的场地
int begin = alloctedCourts[ 0 ] - 1 ;
int end = alloctedCourts[alloctedCourts.size() - 1 ] - 1 ;
if ( ! this -> IsValidOwner(begin, end, returner))
{ // 非法持有者不能归还
return false ;
}
this -> freeCourts(begin, end);
return true ;
}
int TennisCenter::getEmpytCourts() const
{
return this -> nEmptyCourt;
}
void showAllocatedCourts( const vector < int >& courts)
{
vector < int > ::const_iterator iter;
for (iter = courts.begin(); iter != courts.end(); ++ iter)
{
cout << * iter << endl;
}
}
int main( int argc, char * argv[])
{
TennisCenter tennisCenter;
vector < int > allocatedCourts;
bool result = 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();
return 0 ;
}