百度程式設計大賽試題----數7 加強版遊戲(C++演算法實現)
歡迎大家提出意見,一起討論!
一、題目
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"); }