結果

問題 No.635 自然門松列
ユーザー asugen0402asugen0402
提出日時 2019-04-24 09:48:06
言語 C
(gcc 12.3.0)
結果
AC  
実行時間 2 ms / 650 ms
コード長 4,493 bytes
コンパイル時間 1,457 ms
コンパイル使用メモリ 33,408 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-04-24 23:19:19
合計ジャッジ時間 1,563 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 AC 1 ms
5,376 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 1 ms
5,376 KB
testcase_05 AC 1 ms
5,376 KB
testcase_06 AC 1 ms
5,376 KB
testcase_07 AC 1 ms
5,376 KB
testcase_08 AC 1 ms
5,376 KB
testcase_09 AC 1 ms
5,376 KB
testcase_10 AC 1 ms
5,376 KB
testcase_11 AC 1 ms
5,376 KB
testcase_12 AC 1 ms
5,376 KB
testcase_13 AC 1 ms
5,376 KB
testcase_14 AC 2 ms
5,376 KB
testcase_15 AC 1 ms
5,376 KB
testcase_16 AC 1 ms
5,376 KB
testcase_17 AC 2 ms
5,376 KB
testcase_18 AC 1 ms
5,376 KB
testcase_19 AC 1 ms
5,376 KB
testcase_20 AC 1 ms
5,376 KB
testcase_21 AC 1 ms
5,376 KB
testcase_22 AC 1 ms
5,376 KB
testcase_23 AC 1 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_BUMB_CNT		3										// 竹数
#define D_REL_LL		0										// 小のまま
#define D_REL_LR		1										// 小→大
#define D_REL_RR		2										// 大のまま
#define D_REL_RL		3										// 大→小
#define D_REL_SS		4										// 同一長のまま
#define D_REL_SL		5										// 同一長→小
#define D_REL_SR		6										// 同一長→大

// 内部変数
static FILE *szpFpI;											// 入力
static int si1Len[D_BUMB_CNT];									// 長さ
static int si1Add[D_BUMB_CNT];									// 生長

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpA;
	static int siTNo;
#endif

// 出力
int
fOut(
	char *pcpLine				// <I> 1行
)
{
	char lc1Buf[1024];

#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, pcpLine)) {
		siRes = -1;
	}
#else
	printf("%s", pcpLine);
#endif

	return 0;
}

// 比較
int
fCmp(
	int piVal1					// <I> 値1
	, int piVal2				// <I> 値2
)
{
	if (piVal1 < piVal2) {
		return -1;
	}
	else if (piVal1 > piVal2) {
		return 1;
	}

	return 0;
}

// 関係 - 取得
int
fGetRel(
	int piNo1					// <I> 竹1 0~
	, int piNo2					// <I> 竹2 0~
)
{
	// 比較
	int liCmpL = fCmp(si1Len[piNo1], si1Len[piNo2]);
	int liCmpA = fCmp(si1Add[piNo1], si1Add[piNo2]);
	if (liCmpL < 0) {
		if (liCmpA <= 0) {
			return D_REL_LL;
		}
		else {
			return D_REL_LR;
		}
	}
	else if (liCmpL > 0) {
		if (liCmpA >= 0) {
			return D_REL_RR;
		}
		else {
			return D_REL_RL;
		}
	}
	else {
		if (liCmpA < 0) {
			return D_REL_SL;
		}
		else if (liCmpA > 0) {
			return D_REL_SR;
		}
		else {
			return D_REL_SS;
		}
	}
}

// 同一長となる時間 - 取得
double
fGetTime(
	int piNo1					// <I> 竹1 0~
	, int piNo2					// <I> 竹2 0~
)
{
	return fabs(si1Len[piNo1] - si1Len[piNo2]) / fabs(si1Add[piNo1] - si1Add[piNo2]);
}

// 判定
int
fJudge(
)
{
	// 関係 - 取得
	int liRel1 = fGetRel(0, 1);
	if (liRel1 == D_REL_SS) {
		return -1;
	}
	int liRel2 = fGetRel(1, 2);
	if (liRel2 == D_REL_SS) {
		return -1;
	}
	int liRel3 = fGetRel(2, 0);
	if (liRel3 == D_REL_SS) {
		return -1;
	}

	// 関係 - 比較
	switch (liRel1) {
	case D_REL_LL:
	case D_REL_SL:
		switch (liRel2) {
		case D_REL_LR:
		case D_REL_RR:
		case D_REL_RL:
		case D_REL_SR:
			return 0;
		default:
			return -1;
		}

	case D_REL_RR:
	case D_REL_SR:
		switch (liRel2) {
		case D_REL_LL:
		case D_REL_LR:
		case D_REL_RL:
		case D_REL_SL:
			return 0;
		default:
			return -1;
		}

	case D_REL_LR:
	case D_REL_RL:
		switch (liRel2) {
		case D_REL_LL:
		case D_REL_RR:
		case D_REL_SL:
		case D_REL_SR:
			return 0;

		default:

			// 同一長となる時間 - 取得
			double ldTime1 = fGetTime(0, 1);
			double ldTime2 = fGetTime(1, 2);
			if (ldTime1 == ldTime2) {
				return -1;
			}
			else {
				return 0;
			}
		}
	}

	return -1;
}

// 実行メイン
int
fMain(
)
{
	int i, j, liRet;
	char lc1Buf[1024];

	// テスト数 - 取得
	int liTCnt;
	fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
	sscanf(lc1Buf, "%d", &liTCnt);

	// テスト - 実行
	for (i = 0; i < liTCnt; i++) {

		// 長さ・生長 - 取得
		for (j = 0; j < D_BUMB_CNT; j++) {
			fscanf(szpFpI, "%d", &si1Len[j]);
		}
		for (j = 0; j < D_BUMB_CNT; j++) {
			fscanf(szpFpI, "%d", &si1Add[j]);
		}
		fgets(lc1Buf, sizeof(lc1Buf), szpFpI);

		// 判定
		liRet = fJudge();

		// 出力
		if (liRet == 0) {
			sprintf(lc1Buf, "YES\n");
		}
		else {
			sprintf(lc1Buf, "NO\n");
		}
		fOut(lc1Buf);
	}

	return 0;
}

// 1回実行
int
fOne(
)
{
	int liRet;
	char lc1Buf[1024];

	// 入力 - セット
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", siTNo);
	szpFpI = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", siTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#else
	szpFpI = stdin;
#endif

	// 実行メイン
	liRet = fMain();

	// 残データ有無
#ifdef D_TEST
	lc1Buf[0] = '\0';
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, "")) {
		siRes = -1;
	}
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpI);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", siTNo);
	}
	else {
		printf("NG %d\n", siTNo);
	}
#endif

	return 0;
}

// プログラム開始
int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		siTNo = i;
		fOne();
	}
#else
	fOne();
#endif

	return 0;
}

0