2014-01-04 4 views
0

Вот мое решение проблемы SPOJ:SPOJ samer08e получает неправильный ответ

http://www.spoj.com/problems/SAMER08E/

Это моя логика:

проверить, если данные даты находятся рядом друг с другом. Если они есть, добавьте разницу стоимости. Иначе пропустите.

//header files omitted 

#define REP(i,n) for(int i=0; i<n; i++) 
#define FOR(i,st,end) for(int i=st;i<end;i++) 

int monthDates[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; 

bool isLeap(int y){//check if year is leap 
if(y%4 == 0 && y%100 != 0 || y%400 == 0) 
    return true; 
return false; 
} 

bool checkAdjacent(int prev[], int curr[]){//check if the dates are adjacent to each other 
if(prev[0] == 31 && prev[1] == 12 && curr[0] == 1 && curr[1] == 1 && (curr[2] - prev[2]) == 1)//last and first days of the year 
    return true; 
if(prev[2] == curr[2]){//same year 
    if(prev[1] == curr[1]){//same month 
     if((curr[0]-prev[0]) == 1)//same adjacent dates 
      return true; 
    }else if(curr[1] - prev[1] == 1){//adjacent months 
     if(isLeap(prev[2]) && prev[1] == 2 && curr[1] == 3 && prev[0] == 29 && curr[0] == 1)//for leap year february 
      return true; 
     else if(!isLeap(prev[2]) && monthDates[prev[1]] == prev[0] && curr[0] == 1) 
      return true; 
    } 
} 
return false; 
} 


int main(){ 
int n; 
while(scanf("%d", &n) && n){ 
    int prev[4], curr[4], count = 0; 
    ll totalCost = 0; 
    REP(i,4) 
     scanf("%d", &prev[i]); 
    FOR(i, 1, n){ 
     REP(j,4) 
      scanf("%d", &curr[j]); 
     if(checkAdjacent(prev, curr)){ 
      totalCost += curr[3] - prev[3]; 
      count++; 
     } 
     prev[0] = curr[0]; 
     prev[1] = curr[1]; 
     prev[2] = curr[2]; 
     prev[3] = curr[3]; 
    } 
    printf("%d %lld\n", count, totalCost); 
} 
return 0; 
} 

Программа работает для тестовых случаев, но я продолжаю получать неправильный ответ. Какая ошибка?

+0

Включите весь код, включая макросы. – Niloct

+0

Смешивание анд и орб без круглых скобок (как вы делаете в isLeap), как правило, не очень хорошая идея. –

+0

Я проверил функцию isLeap. Он работает правильно. – trialError

ответ

0

Поскольку есть два человека, записывающих измерения, возможно, что в тот же день может быть записано дважды, что может сбрасывать ваши вычисления потребления.

+0

«Несколько дней Мартин делает это, и в некоторые дни Иза делает». – Niloct

+0

Не явным образом исключают дни, когда оба делают это. –

+1

На входе указано, что они будут в строго возрастающем порядке и что две даты не будут одинаковыми. – trialError

0

Ваша программа не проверяет состояние, когда год прыгает, а месяц не в феврале. Добавьте это условие, и вы получите AC. Надеюсь, это поможет.

Смежные вопросы