top1编程
← 返回题目
题解

童童的电脑

1 条题解

  • 0
    @ 2026-8-6 0:54:22

    P4655 童童的电脑(基础)

    解题思路

    第一步,看懂题目。 童童要买一台电脑,去电脑城问了 CPU、内存、硬盘、显示器、主机、键盘、鼠标等 n 件商品的价格(n 不超过 10)。题目要求用"冒泡排序"把价格从大到小排好,再算出这台电脑的总价。

    第二步,理解冒泡排序的思路。 冒泡排序是"两两比较,大的往前冒"。一共做 n-1 轮,每一轮从左到右比较相邻的两个数:如果前一个比后一个小,就交换它们的位置。一轮结束后,当前最小的数就被"冒泡"到了最后面;第二轮结束后,第二小的数到了倒数第二位……排完 n-1 轮后,整个数组就是从大到小的顺序。因为它像水里的气泡一样不断往上冒,所以叫冒泡排序。

    第三步,顺手算出总价。 总价是把所有价格加起来。可以在读入数据的同时顺便累加,不用再额外扫一遍,这样更省时间。

    第四步,用样例验证。 比如样例 899 1200 500 680 1109 125 103,经过冒泡排序后变成 1200 1109 899 680 500 125 103,正好是从大到小。总价则是 899+1200+500+680+1109+125+103=4616。

    第五步,注意输出格式。 第一行是排好序的 n 个价格,用空格隔开;第二行是总价,一个整数。两层输出之间用换行分开。

    第六步,想一想冒泡的直观画面。 把价格列表竖起来看,价格大的就像泡沫一样往上飘,价格小的往下沉。每一轮比较相邻的两个数,把较小的一直往后交换,就像把一块小石头慢慢沉到水底。轮数越多,排好的部分越多,最后一整列就有序了。因为 n 很小(最多 10 件商品),这种直观但效率一般的排序方法完全够用,也好理解、好记忆。

    参考代码

    // P4655 童童的电脑:用冒泡排序把价格从大到小排列并计算总价
    #include <iostream>
    using namespace std;
    
    int price[15];
    
    int main() {
        int n;
        cin >> n;
        int total = 0;
        for (int i = 0; i < n; i++) {
            cin >> price[i];
            total += price[i];
        }
        // 冒泡排序:每一轮把最小的沉到最后
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if (price[j] < price[j + 1]) { // 前一个比后一个小就交换,得到从大到小
                    int temp = price[j];
                    price[j] = price[j + 1];
                    price[j + 1] = temp;
                }
            }
        }
        for (int i = 0; i < n; i++) {
            if (i > 0) cout << " ";
            cout << price[i];
        }
        cout << endl;
        cout << total << endl;
        return 0;
    }
    

    复杂度分析

    冒泡排序要做 n-1 轮,每轮最多比较 n-1 次,所以时间复杂度 O(n²)。n 最大只有 10,最多也就 100 次比较,非常快。总价的累加是 O(n)。空间上只用一个价格数组,O(1)。

    • 1