結果

問題 No.61 リベリオン
コンテスト
ユーザー btk
提出日時 2015-06-20 14:00:18
言語 C++11(old_compat)
(gcc 12.4.0 + boost 1.89.0)
コンパイル:
g++-12 -O2 -lm -std=gnu++11 -Wuninitialized -DONLINE_JUDGE -include bits/stdc++.h -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 59 ms / 5,000 ms
コード長 2,355 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,366 ms
コンパイル使用メモリ 169,048 KB
実行使用メモリ 7,840 KB
最終ジャッジ日時 2026-03-08 16:02:47
合計ジャッジ時間 1,776 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 4
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:81:25: warning: ‘t’ may be used uninitialized [-Wmaybe-uninitialized]
   81 |                         if (t <= d)cout << "Hit" << endl;
      |                         ^~
main.cpp:70:32: note: ‘t’ was declared here
   70 |                         double t;
      |                                ^
main.cpp:61:25: warning: ‘t’ may be used uninitialized [-Wmaybe-uninitialized]
   61 |                         if (t <= d)cout << "Hit" << endl;
      |                         ^~
main.cpp:51:32: note: ‘t’ was declared here
   51 |                         double t;
      |                                ^

ソースコード

diff #
raw source code

#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
const double eps = 1e-7;


double dist(double t, double v, double h){
	double d = abs(v)*t;
	double k = d / (h * 2);
	k = round(k);
	return round(d - k * 2 * h);
}

double pos(double t, int v, double h,double hy){
	double dd = dist(t, v, h);
	if (dd >= h){
		dd -= h;
		hy = h - hy;
		v = -v;
	}

	if (v < 0)dd = -dd;
	hy += dd;
	if (hy >= h){
		hy = h - (hy - h);
	}
	else if (hy <= 0){
		hy = -hy;
	}
	return hy;
}
int main(){
	/*
	ifstream cin("in.txt");
	ofstream cout("out.txt");
	//*/
	int Q;
	cin >> Q;
	while (Q--){
		int w, h, d, mx, my, hx, hy, vx, vy;
		cin >> w >> h >> d >> mx >> my >> hx >> hy >> vx >> vy;
		d = min(d, 4 * h*w);

		if (vy == 0){
			//tmp
			if (my != hy){
				cout << "Miss" << endl;
				continue;
			}
			double t;
			if ((mx - hx > 0 && vx > 0) || (mx - hx < 0 || vx < 0)){
				t = (mx - hx) / (double)vx;
			}
			else if (mx - hx<0 && vx>0){
				t = (w - hx + w - mx) / (double)abs(vx);
			}
			else if (mx - hx>0 && vx < 0){
				t = (hx + mx) / (double)abs(vx);
			}
			if (t <= d)cout << "Hit" << endl;
			else cout << "Miss" << endl;
			continue;
		}

		if (vx == 0){
			if (mx != hx){
				cout << "Miss" << endl; continue;
			}
			double t;
			if ((my - hy > 0 && vy > 0) || (my - hy < 0 || vy < 0)){
				t = (my - hy) / (double)vy;
			}
			else if (my - hy<0 && vy>0){
				t = (h - hy + h - my) / (double)abs(vy);
			}
			else if (my - hy>0 && vy < 0){
				t = (hy + my) / (double)abs(vy);
			}

			if (t <= d)cout << "Hit" << endl;
			else cout << "Miss" << endl;
			continue;
		}

		double t;
		if ((mx - hx > 0 && vx > 0) || (mx - hx < 0 && vx < 0)){
			t = (mx - hx) / (double)vx;
		}
		else if (mx - hx<0 && vx>0){
			t = (w - hx + w - mx) / (double)abs(vx);
			vx = -vx;
		}
		else if (mx - hx>0 && vx < 0){
			t = (hx + mx) / (double)abs(vx);
			vx = -vx;
		}
		else t = 0;


		bool flag = false;
		while (t<=d){
			if (abs(round(abs(t*vy)) - abs(t*vy)) < eps){
			//	cout << t*vy << endl;
				if (abs(pos(t, vy, h, hy) - my) < eps){
					flag = true;
				//	cout << t << endl;
					break;
				}
			}
			if (vx>0){
				t += abs(w - mx)*2.0 / abs(vx);
			}
			else t += abs(mx)*2.0 / abs(vx);
			vx *= -1;
		}

		if (flag)cout << "Hit" << endl;
		else cout << "Miss" << endl;

	}
	/*
	cin.close();
	cout.close();
	//*/
	return 0;
}
0