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;
}