AOJ 1179 Millennium

問題

Millennium | Aizu Online Judge

  • 変則的な暦でy年m月d日から1000年1月1日まで何日あるかを数える
  • 一年は10ヶ月で、通常の年は20日ある月と19日ある月が交互に訪れる
  • 3の倍数の年は全ての月が20日ある

方針

  • 1年1月1日を1日目として、y年m月d日が何日目かを求め、1000年1月1日(=196471日目)との差を求める
  • 年を数えるときは3年単位で考えると590(=195+195+200)日あり、余りの年は195日あることを使った。
  • 月を足す時はうるう年でないときを補正
  • 日を足すのはそのまま

コード

#include <bits/stdc++.h>
 
using namespace std;
typedef long long ll;
 
#define rep(i, n) for(int i=0; i<(n); ++i)

int main(void){
    int n;
    int y, m, d;
    cin >> n;
    rep(loop, n) {
        cin >> y >> m >> d;
        int day = 0;
        day += d;
        day += 20 * (m-1);
        if(y%3 != 0) day -= (m-1)/2;
        day += 590 * ((y-1) / 3);
        day += 195 * ((y-1) % 3);
        cout << 196471-day << endl;
    }
}

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1885158

反省

  • day = (y-1)*195 + (y-1)/3*5 + 20*(m-1) - min(1, y%3)*((m-1)/2) + dとすれば1行で書けた