2012-09-06 88 views
0

我已经玩了这个问题超过一个星期了,我已经优化了很多,我似乎得到了正确的答案,因为它是一样的我将它与其他已被接受的答案进行比较,但我一直得到错误的答案。我不知道发生了什么事!任何人有任何建议?我认为这是输入或输出的问题,因为我不完全确定这个裁判是如何工作的。所以,如果任何人都可以查明问题,并给我任何关于我的代码的建议,我会非常感激!UVA在线裁判3n + 1:正确的答案是错误的答案

#include <iostream> 
#include <cstdlib> 
#include <stdio.h> 
#include <vector> 

using namespace std; 

class Node{ // node for each number that has teh cycles and number 
private: 
    int number; 
    int cycles; 
    bool cycleset; // so it knows whether to re-set the cycle 

public: 
    Node(int num){ 
     number = num; 
     cycles = 0; 
     cycleset = false; 
    } 

    int getnumber(){ 
     return number; 
    } 
    int getcycles(){ 
     return cycles; 
    } 
    void setnumber(int num){ 
     number = num; 
    } 
    void setcycles(int num){ 
     cycles = num; 
     cycleset = true; 
    } 

    bool cycled(){ 
     return cycleset; 
    } 
}; 

class Cycler{ 
private: 
    vector<Node> cycleArray; 
    int biggest; 

    int cycleReal(unsigned int number){ // actually cycles through the number 
     int cycles = 1; 
     if (number != 1) { 
      if (number < 1000000) { // makes sure it's in vector bounds 
       if (!cycleArray[number].cycled()) { // sees if it's been cycled 
        if (number % 2 == 0) { 
         cycles += this->cycleReal((number/2)); 
        } else { 
         cycles += this->cycleReal((3 * number) + 1); 
        } 
       } else { // if cycled get the number of cycles and don't re-calculate, ends recursion 
        cycles = cycleArray[number].getcycles(); 
       } 
      } else { // continues recursing if it's too big for the vector 
       if (number % 2 == 0) { 
        cycles += this->cycleReal((number/2)); 
       } else { 
        cycles += this->cycleReal((3 * number) + 1); 
       } 
      } 
     } 
     if(number < 1000000){ // sets cycles table for the number in the vector 
      if (!cycleArray[number].cycled()) { 
       cycleArray[number].setcycles(cycles); 
      } 
     } 
     return cycles; 
    } 

public: 
    Cycler(){ 
     biggest = 0; 
     for(int i = 0; i < 1000000; i++){ // initialize the vector, set the numbers 
      Node temp(i); 
      cycleArray.push_back(temp); 
     } 
    } 

    int cycle(int start, int end){ // cycles thorugh the inputted numbers. 
     int size = 0; 
     for(int i = start; i < end ; i++){ 
      size = this->cycleReal(i); 
      if(size > biggest){ 
       biggest = size; 
      } 
     } 
     int temp = biggest; 
     biggest = 0; 
     return temp; 
    } 

    int getBiggest(){ 
     return biggest; 
    } 
}; 

int main() {  
    Cycler testCycler; 
    int i, j; 
    while(cin>>i>>j){ //read in untill \n 
    int biggest = 0; 
    if(i > j){ 
     biggest = testCycler.cycle(j, i); 
    }else{ 
     biggest = testCycler.cycle(i, j); 
    } 
    cout << i << " " << j << " " << biggest << endl; 
    } 
    return 0; 
} 
+0

几年前我和那位法官解决了这个问题(不再有代码了),我记得它对输出格式非常挑剔。虽然*格式错误的正确答案*有一个特定的错误,但在许多此类情况下,它似乎会产生错误的答案。查看答案的格式并发送。 –

+0

请注意,您的评论说“直到阅读\ n”,但它实际上读取直到EOF。 –

+0

好点@VaughnCato。在多年前参加过ACM编程竞赛之后,我可以明确地建议,如果他们说你的数据是按行划分的,那么你应该实际读取行,然后解析数据。但是这种UVA的东西似乎比这更友好,所以你可能会逃避它。 – paddy

回答

4

好了,这行不正确的看向我:

for(int i = start; i < end ; i++){ 

当然要使用<=。我敢打赌,测试集特别包含边界案例来吸引你。

+0

毫无疑问。 “n”的情况确保循环甚至可以运行。 – WhozCraig

+1

它工作!我爱你!非常感谢,我一直在为此工作一周。 – samuraiseoul