题目描述
到香港旅游,到香港旅游,最后一站决定去迪士尼乐园打卡,因为返程机票已经订好,所以我们必须在剩余可游玩时间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;
}
欢迎大家批评指正