読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.139 交差点

問題はこちら
No.139 交差点 - yukicoder

スタートしてからの経過時間をsとおく
交差点の信号は周期2*T[i]なので、s%(2*T[i])で場合分けすれば良さそう
信号を最後まで渡り切るためには時刻0~(T[i]-W[i])の間に渡り始めることは必要十分
さもなくば次の青信号まで待ち時間が発生する

int main(){
	int s=0,p=0,x[110],w[110],t[110],L,i,n;
	//sは経過時間、pは現在位置
	scanf("%d%d",&n,&L);
	for(i=0;i<n;i++)scanf("%d%d%d",x+i,w+i,t+i);
	for(i=0;i<n;i++){
		s+=x[i]-p;
		p=x[i];
		//交差点の直前まで進み、経過時間と現在位置を更新
		if(t[i]-w[i]<s%(t[i]*2))s+=t[i]*2-s%(t[i]*2);
		//渡れないなら次の青まで待機
	}
	printf("%d",s+L-p);
	//最後の交差点から友人宅につくまでL-p進む
	return 0;
}

もちろん配列に読み込む必要はなく、頭から順に処理していけば良い

s,a,x,w,t;
main(L){
	for(scanf("%*d%d",&L);~scanf("%d%d%d",&x,&w,&t);t-w<s%(t*=2)?s+=t-s%t:0)s+=x-a,a=x;
	s=!printf("%d",s+L-a);
}

124B