結果
問題 | No.94 圏外です。(EASY) |
ユーザー |
![]() |
提出日時 | 2019-01-28 11:18:34 |
言語 | C (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 4 ms / 5,000 ms |
コード長 | 3,472 bytes |
コンパイル時間 | 208 ms |
コンパイル使用メモリ | 34,560 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-10-03 03:56:48 |
合計ジャッジ時間 | 1,003 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
#include <float.h>#include <limits.h>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>// 内部定数#define D_POINT_MAX 1000 // 最大中継局数#define D_POINT_LEN2 100 // 通信距離の2乗// 内部構造体 - 中継局情報typedef struct Point {int miX, miY; // 位置int miGNo; // グループ番号 0~} Point;// 内部変数static FILE *szpFpI; // 入力static Point sz1Point[D_POINT_MAX]; // 中継局static int siPCnt; // 中継局数// 内部変数 - テスト用#ifdef D_TESTstatic int siRes;static FILE *szpFpA;#endif// グループ番号 - 取得intfGetGNo(int piPNo // <I> 中継局 0~){// 自分が代表if (sz1Point[piPNo].miGNo == piPNo) {return piPNo;}// 下位へsz1Point[piPNo].miGNo = fGetGNo(sz1Point[piPNo].miGNo);return sz1Point[piPNo].miGNo;}// 実行メインintfMain(int piTNo // <I> テスト番号 1~){int i, j;char lc1Buf[1024], lc1Out[1024];// 入力 - セット#ifdef D_TESTsprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);szpFpI = fopen(lc1Buf, "r");sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);szpFpA = fopen(lc1Buf, "r");siRes = 0;#elseszpFpI = stdin;#endif// 中継局数 - 取得fgets(lc1Buf, sizeof(lc1Buf), szpFpI);sscanf(lc1Buf, "%d", &siPCnt);// 中継局 - 取得for (i = 0; i < siPCnt; i++) {fgets(lc1Buf, sizeof(lc1Buf), szpFpI);sscanf(lc1Buf, "%d%d", &sz1Point[i].miX, &sz1Point[i].miY);// グループ番号 - セットsz1Point[i].miGNo = i;for (j = 0; j < i; j++) {// 距離の2乗int liX = sz1Point[i].miX - sz1Point[j].miX;int liY = sz1Point[i].miY - sz1Point[j].miY;int liLen2 = liX * liX + liY * liY;if (liLen2 > D_POINT_LEN2) {continue;}// グループ番号 - 取得int liGNo1 = fGetGNo(i);int liGNo2 = fGetGNo(j);if (liGNo1 == liGNo2) {continue;}// グループ番号 - 更新sz1Point[liGNo1].miGNo = liGNo2;}}// 最大通信距離 - 取得double ldMax = -1.0;for (i = 0; i < siPCnt; i++) {int liGNo1 = fGetGNo(i);for (j = i + 1; j < siPCnt; j++) {int liGNo2 = fGetGNo(j);// 同一グループのみif (liGNo1 != liGNo2) {continue;}// 距離double ldX = sz1Point[i].miX - sz1Point[j].miX;double ldY = sz1Point[i].miY - sz1Point[j].miY;double ldLen = sqrt(ldX * ldX + ldY * ldY);// 最大通信距離 - 更新if (ldMax < ldLen) {ldMax = ldLen;}}}// 無線機での距離if (ldMax < 0.0) {if (siPCnt < 1) {ldMax = 1.0;}else {ldMax = 2.0;}}else {ldMax += 2.0;}// 結果 - セットsprintf(lc1Out, "%.7lf\n", ldMax);// 結果 - 表示#ifdef D_TESTfgets(lc1Buf, sizeof(lc1Buf), szpFpA);if (strcmp(lc1Buf, lc1Out)) {siRes = -1;}#elseprintf("%s", lc1Out);#endif// 残データ有無#ifdef D_TESTlc1Buf[0] = '\0';fgets(lc1Buf, sizeof(lc1Buf), szpFpA);if (strcmp(lc1Buf, "")) {siRes = -1;}#endif// テストファイルクローズ#ifdef D_TESTfclose(szpFpI);fclose(szpFpA);#endif// テスト結果#ifdef D_TESTif (siRes == 0) {printf("OK %d\n", piTNo);}else {printf("NG %d\n", piTNo);}#endifreturn 0;}intmain(){#ifdef D_TESTint i;for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {fMain(i);}#elsefMain(0);#endifreturn 0;}