0
点赞
收藏
分享

微信扫一扫

csp 小明放学

小沙坨 2022-02-11 阅读 66
算法ccf

注意:红绿灯亮的顺序:红灯亮完是绿灯,然后是黄灯,以此循环

#include<bits/stdc++.h>

using namespace std;

const int MAXSIZE = 1e5 + 10;

struct node {
	long long k;
	long long t;
} a[MAXSIZE];

int main() {
	int n;
	long long r, y, g;
	long long sum = 0;
	scanf("%lld%lld%lld", &r, &y, &g);
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%lld %lld", &a[i].k, &a[i].t);
		//int yy = (sum - a[i].t) / (r + y + g);
		if (a[i].k == 0) {
			sum += a[i].t;
		} else if (a[i].k == 1) {//红 
			if (sum <=a[i].t) {
				sum = sum + a[i].t - sum;
			}
			if (sum > a[i].t) {
				int x = (sum - a[i].t) % (r + y + g);
				if (x > g&&x<=g+y) sum = sum + g+y-x+r;
				if (x > y + g) sum = sum + r + y + g - x;
			}
		} else if (a[i].k == 2) { //黄 
			if (sum <= a[i].t) {
				sum = sum+a[i].t-sum+r;
			}
			if (sum > a[i].t) {
				int x = (sum - a[i].t) % (r + y + g);
				if (x <=r) sum = sum + r - x;
				if (x > g + r && x <= g + r + y) sum = sum + y+g+r - x+r;
			}
		} else if (a[i].k == 3) { //绿 
			if (sum > a[i].t) {
				int x = (sum - a[i].t) % (r + y + g);
				if (x <= y) sum = sum + y + r - x;
				if (x > y && x <=r + y) sum = sum + r + y - x;
			}
		}
	}
	printf("%lld\n",sum);

	return 0;
}
举报

相关推荐

0 条评论