【华为OD】C卷真题:100%通过 查找接口成功率最优时间段 C/C++代码实现[思路+代码]

题目描述:

服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值,数组中的数值为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

     668                                                         
                                                            
              +---+                                                          
  3            |   |       ++                               +       +---|   
  |           |   | 3      +                6               +  |   +   |        +
  |      +     |   |       +         +                      +    |  +   |       +
  |      +    |   +---+    +        +        +++++          +   |  +   |        +
  |      +    | +      |   +   +----+        |   |          +   |  +   |        +
  |      +  3 | +      |   +   +    +      2 |   |     2    +   |  +   |        +
  |      +    | +      |   +   +    +        |   |          +   |  +   |        +
  |      +---+ |     |    |  |    +    ----+   |   +---+    |  |  +   |         +
  |      |     |     |    |  |    +    |       |   |   |    |  |  +   |         +
  |    1 |     |     | 8  |  |    +  1 |   |    | 1 |   | 1 |   |  +   |        +
  |      |     |     |    |  |    +    |   |    |   |   |   |   |  +   |        +
  |  +---+     |     +---+   |    ++---+    ++   +---+   +---+   |  +   |        +
  |  |         |         |   |    |         ++              |   |  |+   |        +
  |0 |         |         | 0 |  0 |         ++              | 0 |  |+   |        +
  |  |         |         |   |    |         ++              |   |  |+   |        +
  +---+         +          +-------+                       +---+| +|+   |        +
                +                                                    +   |        +
    0   1   2   3   4   5   6   7   8   9  10  11  12 + v:    w  u m    u 1 0 2 4
 

题目解析:

        先从左到右进行元素累计求和,产生新数组,然后每次从当前位置开始,从末尾往前算差值再求平均数,看是否满足条件,类似一种贪心算法的操作

代码实现:

#include 
#include 
using namespace  std;
int main() {
	int minAverageLost = 0;
	vector arr;
	vector> res;
	int maxlen = 0;
	cin >> minAverageLost;

	do {
		int val;
		cin >> val;
		if (arr.size() == 0) {
			arr.push_back(val);
		}
		else {
			arr.push_back(val + arr[arr.size() - 1]);
		}
	} while (getchar() != '\n');

	for (int i = 0; i < arr.size(); i++) {
		for (int j = arr.size() - 1; j > i; j--) {
			int sum = i == 0 ? arr[j] : (arr[j] - arr[i - 1]);
			if (j - i + 1 < maxlen) {
				break;
			}
			else if (j - i + 1 > maxlen && (float)sum / (j - i + 1) <= minAverageLost) {
				maxlen = j - i + 1;
				res.clear();
				res.push_back({ i,j });
			}
			else if (j - i + 1 == maxlen && (float)sum / (j - i + 1) <= minAverageLost) {
				res.push_back({i,j});
			}
		}
	}
	for (int i = 0; i < res.size(); i++) {
		cout << res[i][0] << "-" << res[i][1] << " ";
	}
	
	if (res.size() == 0) {
		cout << "NULL" << endl;
	}

	return 0;
}

 【华为OD】C卷真题:100%通过 查找接口成功率最优时间段 C/C++代码实现[思路+代码]_第1张图片

你可能感兴趣的:(杂谈,算法,数据结构,华为od,c语言,c++,python,java)