2021 RoboCom 世界机器人开发者大赛

您所在的位置:网站首页 每种游戏都有它的规则 2021 RoboCom 世界机器人开发者大赛

2021 RoboCom 世界机器人开发者大赛

2024-07-16 18:39| 来源: 网络整理| 查看: 265

dgsj.JPG

很多游戏都有打怪升级的环节,玩家需要打败一系列怪兽去赢取成就和徽章。这里我们考虑一种简单的打怪升级游戏,游戏规则是,给定有 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

思路:枚举每个点s,以s为起点跑最短路,暴力求出最合理的空降位置(Floyd)。以空降位置再跑一遍最短路,维护出双关键字最短路径和路径信息,最后按题意输出路径即可。这一步的具体做法参考城市救援。

时间复杂度O(n^3)。

 

 

#include #include #include #include #include using namespace std; const int INF = 0x3f3f3f3f, N = 1010, M = N*N; struct Edge{ int w=INF,x=0;//w怪兽价值 x武器价值 }g[N][N]; int gg[N][N]; int d[N],wdis[N],xdis[N];//wdis为到空降位置的最短路径,xdis为武器价值 int path[N];//记录路径信息 bool book[N]; int n,m; int Floyd(){//计算空降位置 int num,minn = INF; for(int k = 1; k m; memset(wdis,0x3f,sizeof(wdis)); memset(gg,0x3f,sizeof(gg)); for(int i = 0; i < m; i++){ int u,v,w,x; cin>>u>>v>>w>>x; g[u][v].w = g[v][u].w = w;//Djkstra需要 g[u][v].x = g[v][u].x = x; gg[u][v] = gg[v][u] = w;//Floyd需要 } int num = Floyd(); Djkstra(num);//获得所有点到num点的最短路径信息path cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3