2007百度之星初赛题目(2)

2.大话西游与数字游戏

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

百度spider组的黑龙潭之行在烤着鸡翅,唱着星爷的经典时达到高潮。大家在篝火旁围成一圈,开始玩7”加强版游戏,规则如下:
规则1:遇7的倍数或含7的数时pass
规则2:遇有包含相同数字的数时pass。注意相同数字不必相邻。例如121

数错的惩罚很残酷——吞食烤全羊。为避免惩罚,百度工程师们需要你——史上最强程序员的帮助。百度工程师想知道:
req1 x:符合规则1的第x个数是什么?
req2 y:符合规则2的第y个数是什么?
req12 z:同时符合规则12的第z个数是什么?
query n:数n是规则1中的第几个数,是规则2中的第几个数?

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

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

输入样例
req1 10
req2 10
req12 10
query 14

输出样例
11
10
12
-1 13

评分规则

  1. 程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过1秒,否则该用例不得分;
  2. 要求程序能按照输入样例的格式读取标准输入数据,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;
  3. 该题目共有10个测试数据集,其中数据1~5主要考查正确性,满足x,y,z,n<=1000;输入6~10主要考查时间效率,满足x<=10,000,000y<=1,000,000z<=240,000n<=20,000,000。数据16只包含req1,数据27只包含req2,数据38只包含req12,数据47只包含query,数据510包含全部四种查询。每组数据都恰好包含100个查询。
  4. 该题目20分。

 我的程序:

 

#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()
{
 int nNum = 100;
 string str;
 int nData = 0;
 int nCount = 0;

 string str1[100];
 int nData1[100];
 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!");
  }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值