結果

問題 No.139 交差点
ユーザー omuomu
提出日時 2015-10-01 02:42:52
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 2 ms / 5,000 ms
コード長 3,466 bytes
コンパイル時間 888 ms
コンパイル使用メモリ 95,416 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-07-19 18:49:09
合計ジャッジ時間 2,103 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

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

ソースコード

diff #

#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <string>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <functional>
#include <queue>
#include <stack>
#include <cmath>
#include <iomanip>
#include <list>
#include <tuple>
#include <bitset>
#include <ciso646>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<ll, ll> P;
typedef tuple<ll, ll, ll> T;
typedef vector<ll> vec;

inline bool cheak(ll x, ll y, ll xMax, ll yMax){ return x >= 0 && y >= 0 && xMax > x && yMax > y; }
inline ll toInt(string s) { ll v; istringstream sin(s); sin >> v; return v; }
template<class T> inline string toString(T x) { ostringstream sout; sout << x; return sout.str(); }
template<class T> inline T sqr(T x) { return x*x; }

#define For(i,a,b)	for(ll (i) = (a);i < (b);(i)++)
#define rep(i,n)	For(i,0,n)
#define rFor(i,a,b)	for(ll (i) = (a-1);i >= (b);(i)--)
#define rrep(i,n)	rFor(i,n,0)
#define clr(a)		memset((a), 0 ,sizeof(a))
#define mclr(a)		memset((a), -1 ,sizeof(a))
#define all(a)		(a).begin(),(a).end()
#define sz(a)		(sizeof(a))

const ll dx[8] = { 1, 0, -1, 0, 1, 1, -1, -1 }, dy[8] = { 0, -1, 0, 1, -1, 1, -1, 1 };

const ll mod = 1e9 + 7;
const ll INF = 1e9 + 9;

class Signal{
	int place, length, interval;
	bool permit;
	int count;

public :
	Signal(int place, int length, int interval,bool permit){
		this->place = place;
		this->length = length;
		this->interval = interval;
		this->permit = true;
		this->count = 0;
	}
	int getPlace(){
		return place;
	}
	bool isPermit(){
		return permit;
	}
	int getLength(){
		return length;
	}
	int getInterval(){
		return interval;
	}
	//信号が切り替わるまでの残り時間を返す
	int restTime(){
		return interval - count;
	}
	void elapsedTime(int elapseTime){
		//切り替えを行う回数
		int changeNum = (count + elapseTime) / interval;
		//切り替えを奇数回行う場合、最終的に信号は変わる
		bool change = (changeNum % 2) == 1;
		if (change){
			permit = !permit;
		}
		count = (count + elapseTime) % interval;
	}
};

class SignalDirector{
	vector<Signal> *signalVec;
public :
	void setData(vector<Signal> *signalVec){
		this->signalVec = signalVec;
	}
	void elapsedTime(int elapseTime){
		for (int i = 0; i < signalVec->size(); i++){
			(*signalVec)[i].elapsedTime(elapseTime);
		}
	}
};

int main(){
	int signalNum, targetPlace;
	cin >> signalNum >> targetPlace;

	vector<Signal> signalVec;
	
	for (int i = 0; i < signalNum; i++){
		int place, length, interval;
		cin >> place >> length >> interval;
		signalVec.push_back(Signal(place, length, interval, true));
	}

	SignalDirector signalDirector;
	signalDirector.setData(&signalVec);

	//yuki君の位置
	int myPlace = 0;
	int time = 0;

	for (int i = 0; i < signalNum; i++){
		auto &nextSignal = signalVec[i];
		int nextPlace = nextSignal.getPlace();
		int elapseTime = nextPlace - myPlace;

		signalDirector.elapsedTime(elapseTime);
		time += elapseTime;


		int waitTime = 0;
		if (nextSignal.isPermit() == true){
			if (nextSignal.restTime() < nextSignal.getLength()){
				waitTime = nextSignal.restTime() + nextSignal.getInterval();
			}
		}
		else{
			waitTime = nextSignal.restTime();
		}

		signalDirector.elapsedTime(waitTime);
		time += waitTime;

		myPlace = nextPlace;
	}
	time += targetPlace - myPlace;

	cout << time << endl;

	return 0;
}
0