AOJの1179、Millenniumをc++で解きました。
日付の計算の問題が苦手で、
結構グダグダになりました。
うるう年と平年の月ごとの経過日数をハードコーディングして、
月をindexとしてそのまま取れるようオフセットして経過日数を撮りました。
後はうるう年(i%3==0)判定をすればOK。
問題文はこちら
#include <iostream> | |
#include <string> | |
#define REP(i, n) for ( int i = 0; i < n; i++ ) | |
using namespace std; | |
int month[] = {0, 0, 20, 39, 59, 78, 98, 117, 137, 156, 176, 195, 215, 234 }; | |
int year(int y) { | |
int sum = 0; | |
for ( int i = 1; i < y; i++ ) { | |
if ( i%3 == 0 ) sum += 200; | |
else sum += 195; | |
} | |
return sum; | |
} | |
int getdate(int y, int m, int d) { | |
return year(y) + (y%3==0? (m-1)*20 : month[m]) + d; | |
} | |
int main() { | |
int n, y, m, d; | |
int today = getdate(1000, 1, 1); | |
// int _today = _old(1000, 1, 1); | |
cin >> n; | |
while(n--) { | |
int sub = 0; | |
cin >> y >> m >> d; | |
sub = today - getdate(y, m, d); | |
cout << sub << endl; | |
} | |
return 0; | |
} |