我已经玩了这个问题超过一个星期了,我已经优化了很多,我似乎得到了正确的答案,因为它是一样的我将它与其他已被接受的答案进行比较,但我一直得到错误的答案。我不知道发生了什么事!任何人有任何建议?我认为这是输入或输出的问题,因为我不完全确定这个裁判是如何工作的。所以,如果任何人都可以查明问题,并给我任何关于我的代码的建议,我会非常感激!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;
}
几年前我和那位法官解决了这个问题(不再有代码了),我记得它对输出格式非常挑剔。虽然*格式错误的正确答案*有一个特定的错误,但在许多此类情况下,它似乎会产生错误的答案。查看答案的格式并发送。 –
请注意,您的评论说“直到阅读\ n”,但它实际上读取直到EOF。 –
好点@VaughnCato。在多年前参加过ACM编程竞赛之后,我可以明确地建议,如果他们说你的数据是按行划分的,那么你应该实际读取行,然后解析数据。但是这种UVA的东西似乎比这更友好,所以你可能会逃避它。 – paddy