ICPC予選観戦

7月6日(金)にACM-ICPCプログラミングコンテストが行われました。
今年は参加せず、観戦しながら最初の2問解いたので載せておきます。
しかし、プロコン観戦は地味ですねぇ・・・笑

Problem A ミレニアム

経過した日数を計算して、最終的に1年1月1日から1000年1月1日の経過日数(196471日)から引き算して答えを出しました。

#include <stdio.h>

int solve(int year, int month, int day) {
	int sum_day = 0;
	int i;

	for(i = 1; i < year; i++) {
		if(i % 3 == 0) sum_day += 200;
		else sum_day += 195;
	}
	for(i = 1; i < month; i++) {
		if(year % 3 == 0) sum_day += 20;
		else if(i % 2 == 0) sum_day += 19;
		else sum_day += 20;
	}

	return sum_day + day;
}

int main(void) {
	int i, n;
	int year, month, day;

	scanf("%d", &n);
	for(i = 0; i < n; i++) {
		scanf("%d %d %d", &year, &month, &day);
		printf("%d\n", 196471 - solve(year, month, day));
	}
	return 0;
}

Problem B 繰り返す10進数

数値を桁数に合わせてsprintfで整形。
あとはqsortで文字列をソートしてfor文をまわすだけ。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int comp(const void* a, const void* b) {
	char *aa = (char *)a;
	char *bb = (char *)b;

	return (int)(*bb - *aa);
}

int comp2(const void* a, const void* b) {
	char *aa = (char *)a;
	char *bb = (char *)b;

	return (int)(*aa - *bb);
}

void solve(int a, int L) {
	char str[10], str2[10];
	char fo[10] = "%%0%dd";
	char fo2[10] = "";
	int i, j, a_[20];
	int max, min;

	a_[0] = a;

	sprintf(fo2, fo, L);
	for(i = 1; i <= 19; i++) { 
		sprintf(str, fo2, a_[i - 1]);

		qsort(str, L, sizeof(char), comp);
		max = atoi(str);
		qsort(str, L, sizeof(char), comp2);
		min = atoi(str);
		a_[i] = max - min;
	}

	for(i = 0; i < 20; i++) {
		for(j = i + 1; j < 20; j++) {
			if(a_[i] == a_[j]) {
				printf("%d %d %d\n", i, a_[i], j - i);
				return;
			}
		}
	}
}

int main(void) {
	int a0, L;

	scanf("%d %d", &a0, &L);
	while(a0|L) {
		solve(a0, L);	
		scanf("%d %d", &a0, &L);
	}

	return 0;
}

Problem Aはすぐに解答できたのですが、Bでかなりの凡ミスをしてしまい時間を食ってしまって結局この二つで一時間を費やしました。。。
この時点でトップは3問解いていたので、やっぱすごいなとつくづく思ったり。
精進していきます。はい。