70分运行超时
#include <iostream> using namespace std; //结构体,记录每个路口状态和所剩时间 struct status { int color; int time; }; int r, y, g; status st[100001]; //函数,得到下一个灯色,所剩时间为最大 status nextOf(status now) { status next = { 0,0 }; switch (now.color) { case 1: {//red next.color = 3; next.time = g; break; } case 2: {//yellow next.color = 1; next.time = r; break; } case 3: {//green next.color = 2; next.time = y; break; } default:break; } return next; } //函数:需要再此灯处耗费多少时间 int cost(status now) { switch (now.color) { case 1: {//red return now.time; } case 2: {//yellow return now.time + r; } case 3: {//green return 0; } default:return now.time; } } //设计函数,参数为当前状态,所剩时间和经过时间,返回末状态和所剩时间 status fun(status now, long long ltime) { status t = { 0,0 }; if (now.color == 0) { t.color = now.color; t.time = now.time; return t; } while (now.time < ltime) { ltime -= now.time; now = nextOf(now); } t.color = now.color; t.time = now.time - ltime; /*if (now.time >= ltime) { t.color = now.color; t.time = now.time - ltime; } else { t = fun(nextOf(now), ltime - now.time); }*/ return t; } int main() { cin >> r >> y >> g; int n; cin >> n; for (int i = 0; i < n; i++) { cin >> st[i].color >> st[i].time; } long long sum = 0;//经过时间 for (int i = 0; i < n; i++) { if (st[i].color == 0) { sum += st[i].time; for (int j = i + 1; j < n; j++) { st[j] = fun(st[j], st[i].time); } } else { sum += cost(st[i]); for (int j = i + 1; j < n; j++) { st[j] = fun(st[j], cost(st[i])); } } } cout << sum << endl;; return 0; }
满分瞅他人的,
#include <iostream> using namespace std; //结构体,记录每个路口状态和所剩时间 struct status { int color; int time; }; int r, y, g; status st[100001]; //函数,得到下一个灯色,所剩时间为最大 status nextOf(status now) { status next = { 0,0 }; switch (now.color) { case 1: {//red next.color = 3; next.time = g; break; } case 2: {//yellow next.color = 1; next.time = r; break; } case 3: {//green next.color = 2; next.time = y; break; } default:break; } return next; } //函数:需要再此灯处耗费多少时间 int cost(status now) { switch (now.color) { case 1: {//red return now.time; } case 2: {//yellow return now.time + r; } case 3: {//green return 0; } default:return now.time; } } //设计函数,参数为当前状态,所剩时间和经过时间,返回末状态和所剩时间 status fun(status now, long long ltime) { status t = { 0,0 }; if (now.color == 0) { t.color = now.color; t.time = now.time; return t; } while (now.time < ltime) { ltime -= now.time; now = nextOf(now); } t.color = now.color; t.time = now.time - ltime; /*if (now.time >= ltime) { t.color = now.color; t.time = now.time - ltime; } else { t = fun(nextOf(now), ltime - now.time); }*/ return t; } int main() { cin >> r >> y >> g; int n; cin >> n; long long sum = 0;//经过时间 for (int i = 0; i < n; i++) { cin >> st[i].color >> st[i].time; if (st[i].color == 0) { sum += st[i].time; } else { sum+= cost(fun(st[i], sum%(r+g+y))); } } cout << sum << endl;; return 0; }
就一个关键,将sum%(r+g+y)。迭代或者递归次数限制到了常数级
还有一个就是fun函数对于0即经过一段道路的处理
上面是迭代
下面是递归
#include <iostream> using namespace std; //结构体,记录每个路口状态和所剩时间 struct status { int color; int time; }; int r, y, g; status st[100001]; //函数,得到下一个灯色,所剩时间为最大 status nextOf(status now) { status next = { 0,0 }; switch (now.color) { case 1: {//red next.color = 3; next.time = g; break; } case 2: {//yellow next.color = 1; next.time = r; break; } case 3: {//green next.color = 2; next.time = y; break; } default:break; } return next; } //函数:需要再此灯处耗费多少时间 int cost(status now) { switch (now.color) { case 1: {//red return now.time; } case 2: {//yellow return now.time + r; } case 3: {//green return 0; } default:return now.time; } } //设计函数,参数为当前状态,所剩时间和经过时间,返回末状态和所剩时间 status fun(status now, long long ltime) { status t = { 0,0 }; /*if (now.color == 0) { t.color = now.color; t.time = now.time; return t; } while (now.time < ltime) { ltime -= now.time; now = nextOf(now); } t.color = now.color; t.time = now.time - ltime; */ if (now.color == 0) { t.color = now.color; t.time = now.time; return t; } if (now.time >= ltime) { t.color = now.color; t.time = now.time - ltime; } else { t = fun(nextOf(now), ltime - now.time); } return t; } int main() { cin >> r >> y >> g; int n; cin >> n; long long sum = 0;//经过时间 for (int i = 0; i < n; i++) { cin >> st[i].color >> st[i].time; if (st[i].color == 0) { sum += st[i].time; } else { sum+= cost(fun(st[i], sum%(r+g+y))); } } cout << sum << endl;; return 0; }
递归调用耗时少点,偶然还是必然?