【华为OD】C卷真题:100%通过 查找接口成功率最优时间段 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 

int main() {
    int minAverageLost = 0;
    int arr[1001];
    int res[1001][2];
    int maxlen = 0;
    int size = 0;
    scanf("%d", &minAverageLost);

    int val;
    do {
        scanf("%d", &val);
        if (size == 0) {
            arr[size] = val;
        } else {
            arr[size] = val + arr[size - 1];
        }
        size++;
    } while (getchar() != '\n');

    for (int i = 0; i < size; i++) {
        for (int j = 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;
                for (int k = 0; k < size; k++) {
                    res[k][0] = 0;
                    res[k][1] = 0;
                }
                res[0][0] = i;
                res[0][1] = j;
            } else if (j - i + 1 == maxlen && (float)sum / (j - i + 1) <= minAverageLost) {
                for (int k = 0; k < size; k++) {
                    if (res[k][0] == 0 && res[k][1] == 0) {
                        res[k][0] = i;
                        res[k][1] = j;
                        break;
                    }
                }
            }
        }
    }

    for (int i = 0; i < size; i++) {
        if (res[i][0] != 0 || res[i][1] != 0) {
            printf("%d-%d ", res[i][0], res[i][1]);
        }
    }

    if (res[0][0] == 0 && res[0][1] == 0) {
        printf("NULL\n");
    }

    return 0;
}

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

 

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