2021华为校园招聘算法题

3 篇文章 0 订阅
1 篇文章 0 订阅

题目描述

到香港旅游,到香港旅游,最后一站决定去迪士尼乐园打卡,因为返程机票已经订好,所以我们必须在剩余可游玩时间t分钟内完成游玩,才能不耽误行程,请你为我们设计一条最佳游玩线路,选择规则如下:
1.游玩总时长不超过1,但最接近t
2.游玩时不想走回头路,仅向右或向下两个方向,畅玩到出口
乐园被划分为一个row*col的方格区域地图,在每个方格区域上,标注了游玩的最佳时长,从入园口[0,0]
出发,选定最佳游玩线路,一路畅玩到出口[row-1.co-1]。

输入描述:

首行输入以单个空格分割的三个正整数row和col以及t,row代表地图行数(0 < row <= 13),
col代表地图列数(0 < col <= 13),t代表剩余可游玩时间(0 < t <=600);
接下来row行,每一行包含col个以单个空格分割的数字,代表该方格区域最佳游玩时长time分钟
(0 < time <= 100)

输出描述:

最佳游玩线路游玩总时长,若不存在,请输出-1。

示例1

输入输出示例仅供调试,后台判题数据一般不包含示例
输入
5 5 30
3 5 4 2 3
4 5 3 4 3
4 3 5 3 2
2 5 3 3 5
5 3 4 4 1
输出
30
说明
一种可能的游玩路线是【0.0】->【1.0】->【2,0】->【3,0】->【4,0】->【4,1】->【4,2】
【4,2】->【4,3】->【4,4】,刚好30分钟玩完整个项目,与剩余可玩时间t没有任何偏差,因
此输出30

示例2

输入输出示例仅供调试,后台判题数据一般不包含示例
输入
5 5 10
2 5 4 2 3
4 5 3 4 3
4 3 5 3 2
2 5 3 3 5
5 3 4 4 1
输出
-1
说明
无论走那条路线,其余游玩时间都会超出剩余可玩时间t,因此输出-1

代码

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

int main()
{
	// 定义变量
    int m, n, t;
    int value[13][13] = { 0 };
	// 输入数据
    cin >> m >> n >> t;
    for (int i = 0; i < m; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            cin >> value[i][j];
        }
    }
	// 记录计算结果
    vector<set<int>> Res;
    Res.resize(n * m);
    // 计算过程
    Res[0].insert(value[0][0]);
    for (int i = 1; i < m; ++i)
    {
        value[i][0] += value[i - 1][0];
        Res[i * n].insert(value[i][0]);
    }
    for (int j = 1; j < n; ++j)
    {
        value[0][j] += value[0][j - 1];
        Res[j].insert(value[0][j]);
    }
    
    for (int i = 1; i < m; ++i)
    {
        for (int j = 1; j < n; ++j)
        {
            typename set<int>::iterator it_set1 = Res[(i - 1) * n + j].begin();
            typename set<int>::iterator it_set2 = Res[i * n + j - 1].begin();
        
            for(; it_set1 != Res[(i - 1) * n + j].end(); ++it_set1)
            {
                Res[i * n + j].insert(*it_set1+ value[i][j]);
                for (; it_set2 != Res[i * n + j - 1].end(); ++it_set2)
                {
                    Res[i * n + j].insert( *it_set2 + value[i][j]);
                }
            }
        }
    }
	// 结果判断
    int flag = 0;
    typename set<int>::reverse_iterator it = Res[n * m - 1].rbegin();
    while (it != Res[n * m - 1].rend())
    {
        if (*it <= t)
        {
            cout << *it;
            flag = 1;
            break;
        }
        else
            ++it;
    }
    if (flag == 0)
    {
        cout << -1;
    }

    return 0;
}

欢迎大家批评指正

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值