#P3091. 日志采集系统(100分)
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 145
            Accepted: 37
            Difficulty: 4
            
          
          
          
                       所属公司 : 
                              华为od
                                
            
                      
          
 
- 
                        算法标签>模拟          
 
日志采集系统(100分)
循环
题目的规定有一下三点 1.每成功上报一条日志,奖励1分. 2.每条日志每延迟1s上报扣1分 3.到100条日志必须上报
for循环枚举i每一时刻,pre表示前i-1时刻日志总和,在利用一个循环求出目前时刻所得总分.当pre+now大于等于100时应立刻break.答案即是每个时刻得分的最大值
代码如下
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
    string line;
    getline(cin,line);
    stringstream ss(line);
    string x;
    vector<int> records;
    while(getline(ss,x,',')){
        records.push_back(stoi(x));
    }
	int res = 0;
	int acc = 0;
	for (int i = 0; i < n; i++) {
		acc += records[i];
		int score = 0;
		if (acc >= 100) {
			for (int j = 0; j < i; j++) {
				score += records[j] * (j - i);
			}
			score += 100;
			res = max(score, res);
			break;
		}
		for (int j = 0; j < i; j++) {
			score += records[j] * (j - i);
		}
		score += acc;
		res = max(score, res);
	}
	cout << res << endl;
	return 0;
}
python
records = list(map(int, input().split()))
n = len(records)
res = 0
acc = 0
for i in range(n):
    acc += records[i]
    score = 0
    if acc >= 100:
        for j in range(i):
            score += records[j] * (j - i)
        score += 100
        res = max(score, res)
        break
    for j in range(i):
        score += records[j] * (j - i)
    score += acc
    res = max(score, res)
print(res)
java
import java.util.Scanner;
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int[] records = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        
        int n = records.length;
        int res = 0;
        int acc = 0;
        for (int i = 0; i < n; i++) {
            acc += records[i];
            int score = 0;
            if (acc >= 100) {
                for (int j = 0; j < i; j++) {
                    score += records[j] * (j - i);
                }
                score += 100;
                res = Math.max(score, res);
                break;
            }
            for (int j = 0; j < i; j++) {
                score += records[j] * (j - i);
            }
            score += acc;
            res = Math.max(score, res);
        }
        System.out.println(res);
        sc.close();
    }
}
        题目描述
日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。
- 如果上报太频繁,会对服务端造成压力;
 - 如果上报太晚,会降低用户的体验;
 - 如果一次上报的条数太多,会导致超时失败。
 
为此,项目组设计了如下的上报策略:
- 每成功上报一条日志,奖励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分