2016-09-23 53 views
-2

我有一个挑战,我想请你们引导我一点。我有号码n(赛车手数量)和两行包含n整数(整数实际上代表车手)。这些线代表赛车手结束比赛的顺序。寻找在所有比赛中赛车手a'击败赛车手b'的赛车手

我必须找到所有的双打/双,其中一场比赛的运动员a在两场比赛中都击败了赛车手b。你能指导我一下吗?

Input : 
3 
1 2 3 
2 3 1 
Output :1 (only 2 and 3 have met the condition) 
+0

什么是一个整数的“长度”? “找双打”是什么意思? –

+0

对不起,它的意思是n行整数 –

+0

简单,把整数看作字符串。使用'std :: string :: length()'。 –

回答

0

首先,找到一个数字的长度是很简单的。在C++中,使用math.h时只是ceil(log10(number))。在您的代码中,您可以使用一个非常简单的函数将数字输入转换为向量。例如:

//input number of racers (int racerNum) 
//input number of races (int raceNum) 
vector<vector<int>> result(raceNum, vector<int>(racerNum)); 
for (int race=0; race<raceNum; race++){ 
    //input race results as one string of integers without spaces (int rResult) 
    int curVal = rResult; 
    for (int place = racerNum-1, input=0; place >= 0; place--, input++){ 
     curVal = floor(rResult/pow(10,place)); 
     result.at(race).at(place) = curVal; 
     rResult -= curVal*pow(10, place); 
    } 
} 

或者,您可能想要使用您之前使用空格输入结果的示例。这可以让你拥有超过9位的赛车手,而且这可能更简单。它利用了cin将字符串与空格分隔成更小的字符串的事实。例如:

//get number of racers (int racerNum) 
//get number of races (int raceNum) 
vector<vector<int>> raceResults; 
for (int race=0; race<raceNum; race++){ 
    vector<int> singleResult; 
    cout << "Results of race " << race+1 << ":"; 
    //get input with spaces 
    for (int counter=0; counter<racerNum; counter++){ 
     int result; 
     cin >> result; 
     singleResult.push_back(result); 
    } 
    raceResult.push_back(singleResult); 
} 

我会推荐第二个例子,但第一个例子也可以。第一种是纯数学方法,第二种是利用cin获取输入的方式。无论哪种方式,您都会留下一个或多个种族,其中每个种族都是结果的向量,按照正确的顺序排列。我认为这应该足以让你开始,但如果你需要其他代码或代码的帮助,我可以提供帮助。

+0

谢谢,这个作品就像一个魅力。但是有没有更有效的检查方法?因为如果我使用线性搜索,它将不得不循环多次。检查第一名车手有多少对,然后是第二名,第三名等。 –

+0

@ Roi lam我很高兴代码能够工作,但我认为线性搜索将是最高效的,即使是大型比赛。 – TGrossb