上机课摸鱼:Lab4

阅读: 评论:0

上机课摸鱼:Lab4

上机课摸鱼:Lab4

题目描述

2077年,小南在进行一次常规的宇宙旅行,他要去的星球太远了,直线距离足足有n光年

但是好消息是:

- 人类已经可以使用任意门了,可以借助建造好的任意门进行传送

- 从小南家门口开始,每隔1光年都会有一道任意门,目标星球上也有

美中不足就是:

每道门都有传送的距离限制,假设第i个任意门P[i]=4,那就代表着通过它最远只能从4光年后的那道任意门出来,也就是第(i+4)道门。当然,也可以在第(i+3)道门、第(i+2)道门、第(i+1)道门出来

现在小南拿到了旅途中n个任意门的传送距离限制,记为数组P。他想知道怎么才能用最少的传送次数到达目标星球。

举个例子:

n=5 p=[3, 4, 1, 1, 2]

第0站最远传送距离是3,那么通过它最远能去到3光年后的第3站。

下面介绍两个方案:

1. 他贪心去了最远的第3站,但是第3站的传送距离是1,此时他只能去到第4站。然后在第4站再传送一次到达最终的目的地。总共传送3次

2. 他在第0站只向前传送了1光年,到了第1站。第1站的传送距离有4,可以直接到达目的地了!只需要传送2次

小南觉得这也太酷了,于是拜托你用动态规划方法帮他算算

输入:

第一行,一个整数n。代表着目的地的距离

第二行,n个用空格隔开的数。代表着每个站点的传送距离

输出:

一个整数,旅途中的最少传送次数

样例输入输出

样例1

输入:

5
3 4 1 1 2

输出:

2

#include<iostream>
#include<set>
using namespace std;/** 样例1
* 输入:
* 5
* 3 4 1 1 2
* 输出:
* 2
*/int times = 0;  // 记录迭代次数
set<int> st;  // 记录最小次数void dongtai(int n, int* a)
{// 从最后一个倒推到第一个,往前倒推,第1个和第4个可以到达(从0计数),即将他们传进dongtai()函数进行迭代for (int i = n - 1; i >= 0; i--){if (a[i] + i >= n)  // 即若在第i个门可以直接到达终点,即进入迭代{times++;/*for (int k = 0; k < times; k++)cout << "…";cout << i << " 可到 "<< n <<",当前迭代了" << times << "次" << endl;*/dongtai(i, a);if (i == 0){st.insert(times);}times--;}//else //{//	for (int k = 0; k < times; k++)//		cout << "…";//	cout << "第" << i + 1 << "个门不可以到达,当前迭代了" << times << "次" << endl;	//}	}
}int main()
{int n;  // 一个整数n。代表着目的地的距离cin >> n;int * a = new int[n];  // n个用空格隔开的数。代表着每个站点的传送距离,n个值分别代表从a[0]到a[4] 到a[5]的距离for (int i = 0; i < n; i++){cin >> a[i];}dongtai(n, a);cout << *st.begin();
}

本文发布于:2024-02-01 09:03:01,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170674938335504.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:摸鱼
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23