CCF 201812-2 小明放学 python 满分
题目叙述问题描述:略输入格式:略输出格式:略样例
满分证明解题思路反例(我自己思路,超时)大佬版
满分代码反例(我自己思路,超时)大佬版
题目叙述
问题描述:略
输入格式:略
输出格式:略
样例
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3
样例输出
46
样例输入
30 3 30
3
0 100
1 5
0 11
样例输出
142
满分证明
解题思路
反例(我自己思路,超时)
类似穷举法,模拟全过程
大佬版
边读取边处理 (1)遇到0 直接累加 (2)遇到1,红灯,直接跳到绿灯时间 (3)遇到2,黄灯,同样道理
每次都多加了绿灯时间
后面判断等待时间有没有
tem_time = (m_time-total) % (r + g + y) 最厉害的一条命令,这个地方是对取余最深刻而理解,哪怕m_time-total为负值
后面判断是否大于绿灯等待时间,大于那就需要再加;如果不,这时间点落在之前多加的绿灯区间,不管。
满分代码
反例(我自己思路,超时)
r
, y
, g
= map(int, input().split())
n
= int(input())
hf
= 0
count
= 0
def
xs(xd
, t
):
fl
, ft
= xd
while 1:
# 如果是红灯
if fl
== 1:
if ft
- t
< 1:
fl
= 3
t
= t
- ft
ft
= g
else:
ft
= ft
- t
break
# 如果是黄灯
elif fl
== 2:
if ft
- t
< 1:
fl
= 1
t
= t
- ft
ft
= r
else:
ft
= ft
- t
break
# 如果是绿灯
elif fl
== 3:
if ft
- t
< 1:
fl
= 2
t
= t
- ft
ft
= y
else:
ft
= ft
- t
break
return [fl
, ft
]
for i in
range(n
):
m_type
, m_time
= map(int, input().split())
temp
= 0
if m_type
== 0:
temp
= m_time
hf
+= temp
else:
nw
= xs([m_type
, m_time
], hf
)
if nw
[0] == 1:
temp
= nw
[1]
hf
+= temp
elif nw
[0] == 2:
temp
= nw
[1] + r
hf
+= temp
count
+= temp
print(count
)
大佬版
r
, y
, g
= map(int, input().split())
n
= eval(input())
total
= 0
for _ in
range(n
):
m_type
, m_time
= map(int, input().split())
if m_type
== 0:
total
+= m_time
continue
elif m_type
== 1:
m_time
+= g
elif m_type
== 2:
m_time
+= (r
+ g
)
tem_time
= (m_time
-total
) % (r
+ g
+ y
)
if tem_time
> g
:
total
+= (tem_time
- g
)
print(total
)