UTPC 2012 A問題

ブログ開設記念に先日行われたUTPC2012 (東京大学プログラミングコンテスト)の問題を解説してみたいとおもいます。まずはA問題から。

与えられた年月日の西暦4ケタと月日の4ケタを並び替えて一致させられるかどうかを答える問題。
http://utpc2012.contest.atcoder.jp/tasks/utpc2012_01

基本的なアイディアはとても単純で

  • 適当にscanfなりScannerなりを使って西暦4ケタと月日の4ケタを取得
  • それぞれを1ケタずつ配列に入れて、西暦は西暦、月日は月日でソートする
  • ソートされた配列の要素が一致するかどうかを調べる

というかんじです。答えのソースは次のような感じです。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <algorithm>
#include <limits.h>
#include <string.h>
#include <ctype.h>
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <stack>
using namespace std;

typedef unsigned long long ULL;
typedef vector<int> VI;
typedef pair<int, int> PII;

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

template <typename T> inline T tmax(T t1, T t2) { return t1 > t2 ? t1 : t2; }
template <typename T> inline T tmin(T t1, T t2) { return t1 < t2 ? t1 : t2; }

int main() {
    int y, m, d;
    scanf("%04d/%02d/%02d", &y, &m, &d);
    m = 100 * m + d;

    vector<int> f(4);
    vector<int> b(4);
    REP(i, 4) {
        f[i] = y % 10;
        b[i] = m % 10;
        y = y / 10;
        m = m / 10;
    }

    std::sort(f.begin(), f.end());
    std::sort(b.begin(), b.end());

    bool a = true;
    REP(i,4) {
        if(f[i] != b[i]) {
            a = false;
            break;
        }
    }

    printf(a ? "yesn" : "non");

    return 0;
}