算法与竞赛(第五章)—第2关:STL模板之动态数组:向量vector的应用


任务描述

本关任务:在一座城池中有N个谷仓,每个谷仓分别有Ni​袋粮食并堆成了一列,重量分别为Wj​,为了应对外敌,通常需要在谷仓间调动粮食,每次调动只会选择粮堆最上面的一袋粮食运走,并放在目的谷仓粮堆的最上面。

相关知识

为了完成本关任务,你需要掌握:1.向量的相关操作,2.嵌套使用向量模拟二维动态数组。

向量的相关操作

粮食调动是在粮堆的最上面进行的操作,涉及的向量操作为push_backpop_back,详细的向量具体操作和运用请参考STL模板之动态数组:向量vector的操作

嵌套使用向量模拟二维动态数组

谷仓的数量在不同的测试用例下是不同的,每个谷仓中的粮食袋数是动态变化的,因此,可以使用二维的动态数组来求解,既方便又节约内存。

  • 第一步:定义一个以粮食重量int为数据类型的动态数组vector<int>
  • 第二步:定义一个以粮食重量向量vector<int>为数据类型的动态数组vector<vector<int> > vec

这样,vec的第一维下标就表示谷仓的ID,第二维就是对应谷仓的各袋粮食的重量。

编程要求

本关的编程任务是补全右侧代码片段mainBeginEnd中间的代码,具体要求如下:

  • 创建一个vector<vector<int> > vec二维动态向量,读取各个谷仓的初始粮食状况;

  • 基于向量的push_packpop_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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值