题目描述
【日志首次上报最多积分】
日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。
如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验;
如果一次上报的条数太多,会导致超时失败。为此,项目组设计了如下的上报策略:
1、每成功上报一条日志,奖励1分
2、每条日志每延迟上报1秒,扣1分
3、积累日志达到100条,必须立即上报
给出日志序列,根据该规则,计算首次上报能获得的最多积分数。
输入描述
按时序产生的日志条数 T1,T2…Tn,其中 1<=n<=1000,0<=Ti<=100
输出描述
首次上报最多能获得的积分数
题目解析
有前后依赖关系的一般都是动态规划。本题其实不难,主要是根据案例理解题目的意思。
1.总分不超100时,每次提交都要将全部数据加起来在减去因延迟提交而扣掉的分数
2.总分超过100时,就用100去减因延迟提交而扣掉的分数
python代码一:
s = list(map(int,input().split(' ')))
l = []
for i in range(len(s)):
val = 0
rs = s[0:i + 1][::-1]
if sum(s[0:i + 1]) <= 100:
val += sum(s[0:i + 1])
for j in range(i+1):
val -= j*rs[j]
l.append(val)
else:
val = 100
for j in range(i+1):
val -=j*rs[j]
l.append(val)
break
print(max(l))
python代码二:动态规划dp
l = list(map(int,input().split(' ')))
n = len(l)
zscore = [0] * n#得分列表
fscore = [0] * n#减分列表
score = [0] * n#最终得分列表
#初始化值
zscore[0] = l[0]
score[0] = l[0]
for i in range(1,n):
zscore[i] = min(100,zscore[i-1]+l[i])
fscore[i] = fscore[i-1] + l[i-1]
score[i] = zscore[i] - fscore[i]
if zscore[i] == 100:#达到100次必须上报,结束循环
break
print(max(score))