卡码第八题:摆平积木


前言

摆平积木这道题,就是要去计算要移动的最少的积木数量,思路很清晰:

  1. 先计算这n个积木堆的总积木数,然后计算平均每堆的积木数。
  2. 遍历每堆积木,如果该堆积木数少于平均积木数,则累加少的积木数量。
  3. 最后遍历结束,累加的少的积木数就是需要移动的最少积木数。

自己的代码和题解也差不多,但是自己在写代码的过程中由于不熟悉vector的用法,导致代码调试了很久。

以下两段代码有什么不同之处?不同之处在于vector是否有初始化,通过观察代码可以发现,push_back是将数据一个一个加在vector变量之后,如果初始化了vector的长度,那么后续的数据则不是从第1个位置开始排列,而是从初始化的长度之后再开始排列。

vector<int> vec(n);
while(n-- && cin >> num_h){
	vec.push_back(num_h);
}
//vec现在是一个2n长度的数组
vector<int> vec;
while(n-- && cin >> num_h){
	vec.push_back(num_h);
}
//vec现在是一个n长度的数组

第一段代码可以改成如下所示:

vector<int> vec(n);
for (int i = 0; i < n; i++) {
    cin >> vec[i];
}
//vec现在是一个n长度的数组

一、题目

在这里插入图片描述

二、我的代码

代码如下:

#include <iostream>
#include <vector>

using namespace std;

int main() {
	int n;//已经堆好的积木堆数
	int num_h; //存储每堆积木的数量
	while (cin >> n) {
		int sum = 0, avg_sum = 0, least_move = 0;  //最少移动的积木数量
		if (n != 0) {
			vector<int> vec;
			while(n-- && cin >> num_h){
				vec.push_back(num_h);
				sum += num_h;
			}
			avg_sum = sum / vec.size();	//每堆积木的平均积木数
			for (int i = 0; i < vec.size(); i++) {
				if (vec[i] < avg_sum) 
					least_move += (avg_sum - vec[i]);//最少移动积木数求解
				else 
					continue;
			}
			cout << least_move << endl << endl;
			vec.clear();
		}
		else 
			break;
	}
	return 0;
}

三、题解

#include<iostream>
#include<vector>
using namespace std;

int main() {
    int n;
    while (cin >> n) {
        if (n == 0) break;
        vector<int> nums = vector<int>(n, 0);
        int sum = 0;
        for (int i = 0; i < n; i++) {
            cin >> nums[i];
            sum += nums[i];
        }
        int average = sum / n;
        int result = 0;
        for (int i = 0; i < n; i++) {
            if ((nums[i] - average) > 0) result += (nums[i] - average);
        }
        cout << result << endl;
        cout<< endl;
    }
}

总结

题解使用vector类模板的方法,通过vector<int> nums = vector<int>(n, 0);,创建一个名为nums的数组,将nums设置为大小为n的数组,并且数组中的值都为0。这样后续就可以用nums[i]来表示数组中的元素了。

vector<int> nums = vector<int>(n, 0);
int sum = 0;
for (int i = 0; i < n; i++) {
    cin >> nums[i];
    sum += nums[i];
}

或者采用以下代码也是可以的!

vector<int> nums(n);
for (int i = 0; i < n; i++) {
    cin >> nums[i];
    sum += nums[i];
}
//vec现在是一个n长度的数组
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值