题解 P5719 【【深基4.例3】分类平均】

· · 题解

博客食用更佳~

水题,就是个水题,没有任何思维难度,代码量也不大的一道题,本文适合任何新手

思路:

先说一下,平均数就是是指在一组数据中所有数据之和再除以这组数据的个数 (来自百度百科)

↑ 上面那句其实是废话

那怎么算出和呢?让 i 从一开始枚举,如果能被 k 整除,那和就加上 i

for (int i = 1; i <= n; i++) {
    if (i % k == 0) 
      sum += i;
}

但是,这样是极其浪费时间的,我们要珍惜时间!一寸光……(咳咳,走错片场了)

其实可以从 k 开始枚举,每循环一次,i += k

for (int i = k; i <= n; i += k)
    sum += i;

不能被 k 整除的,直接用等差数列求和(也可以用这个求能被 k 整除的数的和)减去能被 k 整除的和即可

那么这组数据的个数又怎么求呢,这甚至不用循环!(zyx

能被 k 整除的,直接 \dfrac{n}{k} 即可,不能被 k 整除的,可以用总数减去能被 k 整除的个数,也就是 n - \dfrac{n}{k}

这样这道题就已经解出来了,直接上代码

# include <iostream>
# include <stdio.h>

using namespace std;

int n, k, sum;

int main () {
    scanf ("%d%d", &n, &k);
    for (int i = k; i <= n; i += k)
        sum += i;
    printf ("%.1f ", double (sum) / (n / k)); // 精确到小数点后 1 位,直接 %.1f 即可
    sum = (1 + n) * n / 2 - sum;
    printf ("%.1f\n", double (sum) / (n - n / k));
    return 0;
}