洛谷 P11768 破自行车

P11768 破自行车

题目背景

某个夏天,18071 号工作室的 staff 集体转业了。辗转至年末,天依终于在 40312 号工作室拉到了合作。但是……看着编号的差距,按时到班可不是一件容易的事情。

七点半,闹铃声响起,早高峰即将迎接起床气!

题目描述

天依住在的城市像一个无穷大的曼哈顿。如果把城市地图放在平面直角坐标系中,任何一个整点 (x,y)(x,y)(x,y) 都是一个十字路口。天依家门口的十字路口为 (0,0)(0,0)(0,0),天依需要从这里出发,尽快抵达工作室所在的十字路口 (a,b)(a,b)(a,b)。每分钟,天依可以从她所在的十字路口 (x,y)(x,y)(x,y) 移动至 (x+1,y)(x+1,y)(x+1,y)(x−1,y)(x-1,y)(x1,y)(x,y+1)(x,y+1)(x,y+1) 或者 (x,y−1)(x,y-1)(x,y1)

天依怎么会走路上班呢?她可以使用一辆很快很邪门的破自行车!骑上它,天依可以从 (x,y)(x,y)(x,y) 瞬间冲到 (x+l,y)(x+l,y)(x+l,y)(x,y+l)(x,y+l)(x,y+l)(x−l,y)(x-l,y)(xl,y)(x,y−l)(x,y-l)(x,yl) 四个位置中的一个,不花费任何时间。但为了避免破自行车散架,天依最多使用 kkk 次自行车。

那么,在破自行车的助力下,天依至少需要多少时间才能从 (0,0)(0,0)(0,0) 出发到达 (a,b)(a,b)(a,b) 呢?

因为工作室经常搬家,所以有多组测试数据。

输入格式

第一行一个整数 TTT,表示测试数据组数。

接下来 TTT 行,每行四个整数 a,b,k,la,b,k,la,b,k,l,分别表示工作室所在的十字路口的横纵坐标,自行车的使用次数限制和自行车的移动距离。

输出格式

输出 TTT 行,第 iii 行一个整数,表示第 iii 组数据中到达工作室的最小时间。

输入输出样例 #1

输入 #1

3
4 5 3 2
1 1 4 5
8 8 4 8

输出 #1

3
2
0

说明/提示

样例解释:

我们使用 >>> 表示猛冲,→\to 表示行走。

对于样例一,一种可能的移动方式是:(0,0)>(2,0)→(3,0)→(4,0)→(4,1)>(4,3)>(4,5)(0,0)>(2,0)\to(3,0)\to(4,0)\to(4,1)>(4,3)>(4,5)(0,0)>(2,0)(3,0)(4,0)(4,1)>(4,3)>(4,5)

对于样例二,一种可能的移动方式是:(0,0)→(0,1)→(1,1)(0,0)\to(0,1)\to(1,1)(0,0)(0,1)(1,1)

对于样例三,一种可能的移动方式是:(0,0)>(0,8)>(8,8)(0,0)>(0,8)>(8,8)(0,0)>(0,8)>(8,8)

数据规模与约定

本题采用捆绑测试。 仅当你通过了该子任务的全部测试数据才能获得该子任务的分值。

对于 100%100\%100% 的数据,1≤T≤1051 \leq T \leq 10^51T1050≤a,b,k,l≤1090 \leq a,b,k,l\leq 10^{9}0a,b,k,l109

对于不同的子任务,作如下约定:

子任务编号TTTa,b,la,b,la,b,lkkk特殊性质子任务分值
111≤105\le10^5105≤109\le10^9109=0=0=0151515
222≤10\le1010≤10\le1010≤10\le1010101010
333≤10\le1010≤109\le10^9109≤20\le2020151515
444≤10\le1010≤109\le10^9109≤103\le10^3103202020
555≤105\le10^5105≤109\le10^9109≤109\le10^9109a,b≤la,b\le la,bl151515
666≤105\le10^5105≤109\le10^9109≤109\le10^9109252525

思路

当l=0时,直接输出a+b。
当l!=0时,按如下思路:
1.画一个平面直角坐标系,向右为x轴,向上为y轴,标出(0,0)和(a,b)。
2.显然在y=b,x=a与两条坐标轴围成的区域中,天依应该尽量自行车猛冲靠近(a,b)点。
3.猛冲之后可能有两种情况,一是冲到(⌊a/l⌋⌊b/l⌋)点,此时自行车有可能还能继续使用,也有可能不能继续使用了;二是把自行车使用次数全部用完了还没到达(⌊a/l⌋⌊b/l⌋)点。(显然,先横冲还是先竖冲都无所谓)
4.如果是第一种情况,则分类讨论。若k=1,则选出a-⌊a/l⌋*l+b-⌊b/l⌋*l、(⌊a/l⌋+1)*l-a+b-⌊b/l⌋*l、a-⌊a/l⌋*l+(⌊b/l⌋+1)*l-b当中的最小值作为答案。若k>=2,则选出a-⌊a/l⌋*l+b-⌊b/l⌋*l、(⌊a/l⌋+1)*l-a+b-⌊b/l⌋*l、a-⌊a/l⌋*l+(⌊b/l⌋+1)*l-b、(⌊a/l⌋+1)*l-a+(⌊b/l⌋+1)*l-b当中的最小值作为答案;如果是第二种情况,直接以a-⌊a/l⌋*l+b-⌊b/l⌋*l作为答案。

#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
	int T,a,b,k,l;
	int tmp,ans;
	cin>>T;
	while(T--)
	{
		cin>>a>>b>>k>>l;
		
		if(l==0)
		{
			cout<<a+b<<endl;
			continue;
		}
		
		tmp=a;
		a-=min(k,(a/l))*l;
		k-=min(k,(tmp/l));
		tmp=b;
		b-=min(k,(b/l))*l;
		k-=min(k,(tmp/l));
		ans=a+b;
		
		if(k==1)
		{
			ans=min(ans,min(l-a+b,a+l-b));
		}
		else if(k>=2)
		{
			ans=min(ans,min(l-a+l-b,min(l-a+b,a+l-b)));
		}
		
		cout<<ans<<endl;
	}
	
	return 0;
}
### 关于平台上的题目 T392022 “自行车”的题解 对于编号为T392022的题目《自行车》,虽然具体的官方题解可能需要通过网站获取最新最权威的信息,通常这类问题涉及的是图论中的路径寻找或者是动态规划等问题解决策略。 考虑到该类问题的一般处理方法,在面对类似“自行车”这样的题目时,可以采用广度优先搜索(BFS)来遍历所有可能的状态直到找到最优解。如果涉及到状态之间的转换成本,则可能会引入Dijkstra算法或是A*启发式搜索算法以提高效率[^1]。 另外值得注意的是,在实际比赛中遇到难题时,有效的团队协作能够帮助克服困难。正如之前提到的比赛经历所显示出来的那样,良好的沟通可以在关键时刻解决问题并取得更好的成绩[^2]。 ```python from collections import deque def bfs(start, end): queue = deque([start]) visited = set() while queue: state = queue.popleft() if state == end: return "Found solution" if state not in visited: visited.add(state) # Generate next states based on current one and add them to the queue. for next_state in generate_next_states(state): queue.append(next_state) return "No solution found" def dijkstra(graph, start, end): distances = {node: float('infinity') for node in graph} distances[start] = 0 unvisited_nodes = list(graph.keys()) while unvisited_nodes: current_node = min( (node for node in unvisited_nodes), key=lambda x: distances[x]) if distances[current_node] == float('infinity'): break unvisited_nodes.remove(current_node) for neighbor, weight in graph[current_node].items(): alternative_route = distances[current_node] + weight if alternative_route < distances[neighbor]: distances[neighbor] = alternative_route return distances[end] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值