Вот мое решение проблемы 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;
}
Программа работает для тестовых случаев, но я продолжаю получать неправильный ответ. Какая ошибка?
Включите весь код, включая макросы. – Niloct
Смешивание анд и орб без круглых скобок (как вы делаете в isLeap), как правило, не очень хорошая идея. –
Я проверил функцию isLeap. Он работает правильно. – trialError