题目描述
日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。
如果上报太频繁,会对服务端造成压力;
如果上报太晚,会降低用户的体验;
如果一次上报的条数太多,会导致超时失败。
为此,项目组设计了如下的上报策略:
每成功上报一条日志,奖励1分
每条日志每延迟上报1秒,扣1分
积累日志达到100条,必须立即上报
给出日志序列,根据该规则,计算首次上报能获得的最多积分数。
输入描述
按时序产生的日志条数 T1,T2…Tn,其中
1 <= n <= 1000
0 <= Ti <= 100
输出描述
首次上报最多能获得的积分数
用例1
输入
1 98 1
输出
98
说明
T1 时刻上报得 1 分
T2 时刻上报得98分,最大
T3 时刻上报得 0 分
用例2
输入
50 60 1
输出
50
说明
如果第1个时刻上报,获得积分50。如果第2个时刻上报,最多上报100条,前50条延迟上报1s,每条扣除1分,共获得积分为 100-50=50
用例3
输入
3 7 40 10 60
输出
37
说明
T1时刻上报得3分
T2时刻上报得7分
T3时刻上报得37分,最大
T4时刻上报得-3分
T5时刻上报,因为已经超了100条限制,所以只能上报100条,得-23分
#这种具有前后依赖关系的题目,一般都是利用动态规划
#先记录下来某时刻上报时能得到多少分,然后减去因为延迟扣去的分
#如果上报的话,之前的得分和扣分都清空
T = list(map(int,input().split()))
N = len(T)
dp = [0]*N #某时刻能得到的分
de = [0]*N #需要扣的分
dp[0] = T[0]
max_score = dp[0] - de[0]
for i in range(1,N):
dp[i] = min(100,dp[i-1]+T[i]) #因为最多100条
de[i] = de[i-1]+dp[i-1]
max_score = max(max_score,dp[i]-de[i])
if dp[i]>=100:
break
print(max_score)