您的位置:首页 > 编程语言 > C语言/C++

百度编程大赛试题----数7 加强版游戏(C++算法实现)

2012-06-28 10:03 375 查看
转载请标明是引用于 http://blog.csdn.net/chenyujing1234

欢迎大家提出意见,一起讨论!



一、题目

2.大话西游与数字游戏

“叉烧鸡翅膀,我呀最爱吃!……”

百度spider组的“黑龙潭之行”在烤着鸡翅,唱着星爷的经典时达到高潮。大家在篝火旁围成一圈,开始玩“数7”加强版游戏,规则如下:

规则1:遇7的倍数或含7的数时pass。

规则2:遇有包含相同数字的数时pass。注意相同数字不必相邻。例如121。

数错的惩罚很残酷——吞食烤全羊。为避免惩罚,百度工程师们需要你——史上最强程序员的帮助。百度工程师想知道:

req1 x:符合规则1的第x个数是什么?

req2 y:符合规则2的第y个数是什么?

req12 z:同时符合规则1、2的第z个数是什么?

query n:数n是规则1中的第几个数,是规则2中的第几个数?

输入格式

输入的每一行为一个查询,由一个查询词和一个无符号整型数组成。共有四种查询,查询词分别为req1、req2、req12、query(区分大小写)。

输出格式

前三种查询输出一个无符号整型的解。对于“query n”的查询,若n是规则中的数则输出相应的解,否则输出-1。

输入样例 例

req1 10

req2 10

req12 10

query 14

输出样例 例

11

10

12

-1 13

评分规则

程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过1秒,否则该用例不得分;

要求程序能按照输入样例的格式读取标准输入数据,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;

该题目共有10个测试数据集,其中数据1~5主要考查正确性,满足x,y,z,n<=1000;输入6~10主要考查时间效率,满足x<=10,000,000,y<=1,000,000,z<=240,000,n<=20,000,000。数据1和6只包含req1,数据2和7只包含req2,数据3和8只包含req12,数据4和7只包含query,数据5和10包含全部四种查询。每组数据都恰好包含100个查询。

该题目20分。



二、C++算法实现

#include <stdio.h>
#include <vector>
#include <iostream>
#include <deque>
#include <string>
#include <math.h>

using namespace std;

bool IsContain7(int nData)
{
	int nRec = nData%10;
	if (nRec == 7)
	{
		return true;
	}
	while (nData/10 > 0)
	{
		nData = nData/10;
		if (nData%10 == 7)
		{
			return true;
		}
	}
	return false;
}

int Req1(int nData)
{
	int nResult = 0;
	int nCount = 0;
	int nUpBound = 7*nData; //不会超过7倍
	for (int i = 6; i <= nUpBound; i ++)
	{
		if ((i % 7 == 0)||IsContain7(i))
		{
			nCount ++;
		}
		if (nCount == nData)
		{
			return i;
		}
	}
}

bool IsRepeat(int nData)
{
	vector<int> Number;
	while (int(nData) >0)
	{
		int nUint = nData%10;
		nData = nData/10;
		for (int i = 0; i < Number.size(); i ++)
		{
			if (nUint == Number[i])
			{
				return true;
			}
		}
		Number.push_back(nUint);
	}
	return false;
}
int Req2(int nData)
{
	int nResult = 0;
	int nUpBound = 11*nData;
	int nCount = 0;
	for (int i = 11; i <= nUpBound; i ++)
	{
		bool bResult = IsRepeat(i);
		if (bResult)
		{
			nCount ++;
		}
		if (nCount == nData)
		{
			return i;
		}
	}
}
int Req12(int nData)
{
	int nResult = 0;
	int nCount = 0;

	int nUpBound = 7*nData; //不会超过7倍
	for (int i = 6; i <= nUpBound; i ++)
	{
		if ((i % 7 == 0)||IsContain7(i) || IsRepeat(i))
		{
			nCount ++;
		}
		if (nCount == nData)
		{
			return i;
		}
	}

	return nResult;
}
void Query(int nData, int * nPos1, int *nPos2)
{
	int nResult = 0;
	int nNum = nData/7 + 1;
	if ((nData % 7 != 0)&& !IsContain7(nData) && !IsRepeat(nData))
	{
		*nPos2 = -1;
		*nPos1 = -1;
	}
	vector<int> nData7;
	for (int i = 1; i < nNum; i ++)
	{
		int nData1 = Req1(i);
		nData7.push_back(nData1);

		if (nData1 == nData)
		{
			*nPos1 = i;
		}
	}

	int nNum2 = nData/11 + 1;

	vector<int> nData11;
	for (int j = 1; j < nNum2; j ++)
	{
		int nData2 = Req2(j);
		nData11.push_back(nData2);

		if (nData2 == nData)
		{
			*nPos2 = j;
		}
	}
}

int main()
{
	const int nNum = 4;
	string str;
	int nData = 0;
	int nCount = 0;

	string str1[nNum] = {"req1", "req2", "req12", "query"};
	int nData1[nNum] = {10, 10, 10, 14};
// 	for (int j = 0; j < nNum; j ++)
// 	{
// 		cin>>str;
// 		cin>>nData;
// 		str1[j] = str;
// 		nData1[j] = nData;
// 	}
	for (int i = 0; i < nNum; i ++)
	{
		str = str1[i];
		nData = nData1[i];  
		if ( str == "req1")
		{
			long nResult = Req1(nData);
			printf("%ld\n",nResult);
		}
		else if(str == "req2")
		{
			long nResult = Req2(nData);
			printf("%ld\n",nResult);
		}
		else if (str == "req12")
		{
			long nResult = Req12(nData);
			printf("%ld\n",nResult);
		}
		else if (str == "query")
		{
			nCount ++;
			int nPos1 = 0;
			int nPos2 = 0;
			Query(nData,&nPos1,&nPos2);

			if (!nPos1)
			{
				nPos1 = -1;
			}
			if (!nPos2)
			{
				nPos2 = -1;
			}
			printf("%ld  %ld\n",nPos1,nPos2);
		}
		else
		{
			printf("Input Error!\n");
		}
	}

	system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: