#P3027. 查找接口成功率最优时间段(100分)
-
1000ms
Tried: 263
Accepted: 50
Difficulty: 5
所属公司 :
华为od
-
算法标签>暴力枚举
查找接口成功率最优时间段(100分)
思路:暴力枚举
-
观察一下数据范围,发现数组长度n≤100,因此我们可以枚举所有的时间段
-
外层循环枚举左端点,内层循环枚举右端点,遇到符合要求的,就判断长度是否是最长的,如果最长就更新manlen和res,如果不是最长,但是和最长的一样长,就把当前时间段添加到答案里面
-
总的时间复杂度为O(n2),完全不会超时
JavaScript代码
let n = 0;
let w = new Array(110).fill(0);
let res = [];
let maxlen = 0;
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.question("", (m) => {
rl.question("", (line) => {
w = line.split(" ").map(Number);
n = w.length;
for (let l = 0; l < n; l++) {
for (let r = l; r < n; r++) {
let sum = 0;
for (let i = l; i <= r; i++) {
sum += w[i];
}
if (sum <= m * (r - l + 1)) {
if (maxlen < r - l + 1) {
maxlen = r - l + 1;
res = []; // 需要把之前的答案清楚
}
if (maxlen == r - l + 1) {
res.push([l, r]); // 添加答案
}
}
}
}
for (let e of res) {
process.stdout.write(`${e[0]}~${e[1]} `);
}
rl.close();
});
});
C++代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> vec;
int temp;
while (cin >> temp) {
vec.push_back(temp);
if (cin.get() == '\n')
break;
}
int len = 0;
vector<vector<int> > res;
int m = vec.size();
for (int i = 0; i < m; i++) {
int sum = 0;
for (int j = i; j < m; j++) {
sum += vec[j];
if (sum <= n * (j - i + 1)) {
if (len < j - i + 1) {
len = j - i + 1;
res.clear();
}
if (len == j - i + 1)
res.push_back({ i,j });
}
}
}
int k = res.size();
for (int i = 0; i < k; i++) {
if (i != k - 1)
cout << res[i][0] << "-" << res[i][1] << " ";
else
cout << res[i][0] << "-" << res[i][1];
}
return 0;
}
Java代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt(); //第一行读入一个整数m
int[] w = new int[110];
int n = 0;
while (sc.hasNextInt()) { //第2行读入n个整数
w[n++] = sc.nextInt();
}
List<List<Integer>> res = new ArrayList<>(); //存放所有的时间段
int maxlen = 0; //满足题目条件最大长度的时间段
for (int l = 0; l < n; l++) { //枚举数组左端点
for (int r = l, sum = 0; r < n; r++) { //枚举数组右端点
sum += w[r];
if (sum <= m * (r - l + 1)) { //当前区间满足题目条件
if (maxlen < r - l + 1) {
maxlen = r - l + 1;
res.clear(); //需要把之前的答案清楚
}
if (maxlen == r - l + 1) {
res.add(Arrays.asList(l, r)); //添加答案
}
}
}
}
for (List<Integer> e : res) {
System.out.printf("%d~%d ", e.get(0), e.get(1));
}
}
}
Python代码
n = 0
w = [0] * 110
res = []
maxlen = 0
m = int(input()) # 第一行读入一个整数m
w=list(map(int, input().split()))
n=len(w)
for l in range(n): # 枚举数组左端点
for r in range(l, n): # 枚举数组右端点
sum = 0
for i in range(l, r + 1):
sum += w[i]
if sum <= m * (r - l + 1): # 当前区间满足题目条件
if maxlen < r - l + 1:
maxlen = r - l + 1
res.clear() # 需要把之前的答案清楚
if maxlen == r - l + 1:
res.append([l, r]) # 添加答案
for e in res:
print(f"{e[0]}~{e[1]}", end=" ")
题目描述
服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值,数组中的数值为 0 ~ 100 的整数,给定一个数值( minAverageLost )表示某个时间段内平均失败率容忍值,即下均失败率小于等于 minAverageLost ,找出数组中最长时间段,如果未找到则直接返回 NULL。
输入描述
输入有两行内容,第一行为(minAverageLost),
第二行为(数组),数组元素通过空格(“ “)分隔,minAverageLost及数组中元素取值范围为 0−100的整数,数组元素的个数不会超过 100 个
输出描述
找出平均值小于等于 minAverageLost 的最长时间段,输出数组下标对,格式($beginindex )-(endindx)(下标从 0 开始),如果同时存在多个最长时间段,则输出多个下标对与下标对之间使用空格(” ”)拼接,多个下标对按下标对从小到大排序。
样例1
输入
1
0 1 2 3 4
输出
0-2
说明:
A、输入解释: minAverageLost=1 ,数组[0,1,2,3,4]
B、前 3 个元素的平均值为 1 ,因此数组第一个至第三个数组下标,即 0 - 2
样例2
输入
2
0 0 100 2 2 99 0 2
输出
0-1 3-4 6-7
说明
A、输入解释: minAverageLost=2 ,数组[ 0,0,100,2,2,99,0,2]
B、通过计算小于等于 2 的最长时间段为:数组下标为 0 - 1 即[0,0],数组下标为3 - 4即[2,2],数组下标为 6 - 7,即[0,2], 这三个部分都满足平均值小于等 2 的要求,因此输出 0 - 1 3 - 4 6 -7