結果
| 問題 |
No.139 交差点
|
| コンテスト | |
| ユーザー |
omu
|
| 提出日時 | 2015-10-01 02:42:52 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
#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;
}
omu