打怪升级-世界机器人开发者大赛

很多游戏都有打怪升级的环节,玩家需要打败一系列怪兽去赢取成就和徽章。这里我们考虑一种简单的打怪升级游戏,游戏规则是,给定有 N 个堡垒的地图,堡垒之间有道路相连,每条道路上有一只怪兽把守。怪兽本身有能量,手里的武器有价值。打败怪兽需要的能量等于怪兽本身的能量,而怪兽一旦被打败,武器就归玩家所有 —— 当然缴获的武器价值越高,玩家就越开心。

你的任务有两件:

帮助玩家确定一个最合算的空降位置,即空降到地图中的某个堡垒,使得玩家从这个空降点出发,到攻下最难攻克(即耗费能量最多)的那个堡垒所需要的能量最小;
从这个空降点出发,帮助玩家找到攻克任意一个其想要攻克的堡垒的最省能量的路径。如果这种路径不唯一,则选择沿途缴获武器总价值最高的解,题目保证这种解是唯一的。

输入格式:

输入第一行给出两个正整数 N (≤1000) 和 M,其中 N 是堡垒总数,M 是怪兽总数。为简单起见,我们将堡垒从 1 到 N 编号。随后 M 行,第 i 行给出了第 i 只怪兽的信息,格式如下:

B1 B2 怪兽能量 武器价值
其中 B1 和 B2 是怪兽把守的道路两端的堡垒编号。题目保证每对堡垒之间只有一只怪兽把守,并且 怪兽能量 和 武器价值 都是不超过 100 的正整数。

再后面是一个正整数 K(≤N)和玩家想要攻克的 K 个目标堡垒的编号。

输出格式:

首先在一行中输出玩家空降的堡垒编号 B0。如果有多种可能,则输出编号最小的那个。

随后依次为玩家想要攻克的每个堡垒 B 推荐最省能量的攻克路径,并列出需要耗费的能量值和沿途缴获武器的总价值。注意如果最省力的路径不唯一,则选择沿途缴获武器总价值最高的解。格式为:

B0->途经堡垒1->…->B
总耗费能量 武器总价值

输入样例:

6 12
1 2 10 5
2 3 16 20
3 1 4 2
2 4 20 22
4 5 2 2
5 3 12 6
4 6 8 5
6 5 10 5
6 1 20 25
1 5 8 5
2 5 2 1
2 6 8 5
4
2 3 6 5

输出样例:

5
5->2
2 1
5->1->3
12 7
5->4->6
10 7
5
0 0

和旅游规划很像,不同的是需要提前求出来起点。
这次用floy作的,感觉还不错。

#include 
#include 
#include 
#include 
using namespace std;
using pii = pair<int, int>;
const long long INF = 1e8;
const int n = 1010;int N, M;
pii rode[n][n];
int parent[n][n];
void init(int N)
{for (int i = 1; i <= N; i++)for (int j = 1; j <= N; j++){parent[i][j] = j;if (i == j)rode[i][0] = {0, 0};elserode[i][j] = {INF, 0};}
}
void floyd()
{for (int k = 1; k <= N; k++)for (int i = 1; i <= N; i++)for (int j = 1; j <= N; j++){if (rode[i][k].first + rode[k][j].first < rode[i][j].first ||(rode[i][k].first + rode[k][j].first == rode[i][j].first &&rode[i][k].second + rode[k][j].second > rode[i][j].second)){// cout  << j << " -- " << k << endl;rode[i][j].first = rode[i][k].first + rode[k][j].first;rode[i][j].second = rode[i][k].second + rode[k][j].second;parent[i][j] = parent[i][k];}}
}
int s;
int main()
{cin >> N >> M;init(N);while (M--){int x, y, d, s;cin >> x >> y >> d >> s;rode[x][y] = {d, s};rode[y][x] = {d, s};}floyd();cin >> M;vector<int> v(M);for (auto &e : v)cin >> e;int mint = INF;for (int i = 1; i <= N; i++){int e = i;int maxt = 0;for (int x = 1; x <= N; x++)maxt = max(maxt, rode[e][x].first);if (maxt < mint)mint = maxt, s = e;}cout << s << endl;for (auto &e : v){int i = s;while (i != e){cout << i;cout << "->";i = parent[i][e];}cout << i;cout << endl;cout << rode[s][e].first << " " << rode[s][e].second << endl;}return 0;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部