任务描述
本关任务:在一座城池中有N个谷仓,每个谷仓分别有Ni袋粮食并堆成了一列,重量分别为Wj,为了应对外敌,通常需要在谷仓间调动粮食,每次调动只会选择粮堆最上面的一袋粮食运走,并放在目的谷仓粮堆的最上面。
相关知识
为了完成本关任务,你需要掌握:1.向量的相关操作,2.嵌套使用向量模拟二维动态数组。
向量的相关操作
粮食调动是在粮堆的最上面进行的操作,涉及的向量操作为push_back
和pop_back
,详细的向量具体操作和运用请参考STL模板之动态数组:向量vector的操作。
嵌套使用向量模拟二维动态数组
谷仓的数量在不同的测试用例下是不同的,每个谷仓中的粮食袋数是动态变化的,因此,可以使用二维的动态数组来求解,既方便又节约内存。
- 第一步:定义一个以粮食重量
int
为数据类型的动态数组vector<int>
; - 第二步:定义一个以粮食重量向量
vector<int>
为数据类型的动态数组vector<vector<int> > vec
。
这样,vec
的第一维下标就表示谷仓的ID
,第二维就是对应谷仓的各袋粮食的重量。
编程要求
本关的编程任务是补全右侧代码片段main
中Begin
至End
中间的代码,具体要求如下:
-
创建一个
vector<vector<int> > vec
二维动态向量,读取各个谷仓的初始粮食状况; -
基于向量的
push_pack
和pop_back
等基本操作,实现M次调动粮食; -
输出最后各个谷仓
ID
、该谷仓中各袋粮食的重量以及总的重量(请严格遵循测试样例的输出格式)。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入: 5
3 79 32 29
4 42 41 92 6
6 68 37 63 11 34 79
2 63 36
3 27 74 67
6
move 1 2
move 3 0
move 3 0
move 4 2
move 1 4
move 2 0
预期输出: 0 79 32 29 36 63 67 306
1 42 41 83
2 68 37 63 11 34 79 6 298
3 0 0
4 27 74 92 193
输入格式: 第一行整数N:谷仓数量
接下来N行,依次为各个谷仓ID=[0,1,...,N−1]的初始信息:第一个数字为该谷仓的初始粮食袋数Ni,后面接着Ni袋粮食的重量Wj
接下来一行整数M:调动粮食次数
接下来M行,每行move a b:将谷仓a粮堆的最后一袋粮食调动到谷仓b粮堆的最上面
输出格式: 输出N行,按顺序输出谷仓ID=[0,1,...,N−1]的最终状态信息:ID W0 W1 ... Wj Wsum,若谷仓空了,则输出为ID 0 0
注意:每行所有数字中间空格隔开,末尾换行\n
//
// main.cpp
// step2
//
// Created by ljpc on 2018/7/23.
// Copyright © 2018年 ljpc. All rights reserved.
//
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(int argc, const char * argv[]) {
// 请在这里补充代码,完成本关任务
/********* Begin *********/
int N, M;
cin >> N;
vector<vector<int> > vec(N);
for(int i = 0; i < N; i++) {
int num;
cin >> num;
vec[i].resize(num);
for(int j = 0; j < num; j++) {
cin >> vec[i][j];
}
}
cin >> M;
for(int i = 0; i < M; i++) {
string operation;
int a, b;
cin >> operation >> a >> b;
if(operation == "move" && a != b && !vec[a].empty()) {
vec[b].push_back(vec[a].back());
vec[a].pop_back();
}
}
for(int i = 0; i < N; i++) {
cout << i << " ";
if(vec[i].empty()) {
cout << "0 0" << endl;
} else {
int sum = 0;
for(int j = 0; j < vec[i].size(); j++) {
if(vec[i][j] != 0) {
cout << vec[i][j] << " ";
sum += vec[i][j];
}
}
cout << sum << endl;
}
}
/********* End *********/
return 0;
}