前言
摆平积木这道题,就是要去计算要移动的最少的积木数量,思路很清晰:
- 先计算这n个积木堆的总积木数,然后计算平均每堆的积木数。
- 遍历每堆积木,如果该堆积木数少于平均积木数,则累加少的积木数量。
- 最后遍历结束,累加的少的积木数就是需要移动的最少积木数。
自己的代码和题解也差不多,但是自己在写代码的过程中由于不熟悉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长度的数组