首页 > 其他分享 >ABC 320F Fuel Round Trip

ABC 320F Fuel Round Trip

时间:2024-06-12 20:34:08浏览次数:24  
标签:ABC min int 站点 320F maxn Fuel dp dis

题意
在坐标轴上给定N个点,坐标依次为x1,x2,...,xn,你需要从原点前往xn并且实现往返,其中从第一个点到第N-1个点上有加油站,其中第i个加油站可以花费p[i]购买f[i]升汽油,汽油的上限为H升,每行驶一单位距离需要花费一升汽油。在全部过程中每个加油站最多使用一次,判断是否可以完成行程并输出最小花费。(1<=N,H<=300)

思路
考虑dp,我们先把反向行驶的过程转化成正向行驶的过程。并设dp[i][j][k]为到达第i个站点,第一次经过时还持有j升油,第二次经过时还持有k升油时的最小花费。
那么假设下一站为第i+1个站点,那么从第i个站点到达第i+1个站点就有三种转移:

  1. 第i个站点不选择加油
  2. 第i个站点去程加油
  3. 第i个站点返程加油

设dis为第i+1个站点与第i个站点的距离那么对应的状态转移方程就是:

  1. dp[i+1][j-dis][k-dis]=min(dp[i+1][j-dis][k-dis],dp[i][j][k]),(j>=dis&&k>=dis)
  2. dp[i+1][min(h,j+f[i])-dis][k-dis]=min(dp[i+1][min(h,j+f[i])-dis][k-dis],dp[i][j][k]+p[i]),(min(h,j+f[i])>=dis&&k>=dis)
  3. dp[i+1][j-dis][min(k+f[i],h)-dis]=min(dp[i+1][j-dis][min(h,k+f[i])-dis],dp[i][j][k]+p[i]),
    (min(h,k+f[i])>=dis&&j>=dis)
    接下来我们要考虑一个细节:
    我们强行将返程的过程视为正向的过程,若我们去程到达xn时剩下的油量位h-i(即去程花费了i升油),且我们在返程的过程中是将油量视为H开始的。那么返程时的油量j必须要保证大于或等于h-i,否则就无法到达。

代码

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int maxn=305;
int p[maxn],f[maxn],x[maxn];
int dp[maxn][maxn][maxn];
const int inf=1e9;

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	int n,h;
	cin>>n>>h;
	for(int i=1;i<=n;i++) cin>>x[i];
	for(int i=1;i<=n-1;i++) cin>>p[i]>>f[i];
	for(int i=0;i<maxn;i++) for(int j=0;j<maxn;j++) for(int k=0;k<maxn;k++) dp[i][j][k]=inf;
	dp[0][h][h]=0;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<=h;j++)
		  for(int k=0;k<=h;k++)
		  {
		  	 int dis=x[i+1]-x[i];
		  	 if(j>=dis&&k>=dis)
		  	   dp[i+1][j-dis][k-dis]=min(dp[i+1][j-dis][k-dis],dp[i][j][k]);
		  	 if(min(j+f[i],h)>=dis&&k>=dis)
		  	   dp[i+1][min(j+f[i],h)-dis][k-dis]=min(dp[i+1][min(j+f[i],h)-dis][k-dis],dp[i][j][k]+p[i]);
		  	 if(j>=dis&&min(h,k+f[i])>=dis)
		  	   dp[i+1][j-dis][min(h,k+f[i])-dis]=min(dp[i+1][j-dis][min(h,k+f[i])-dis],dp[i][j][k]+p[i]);
		  }
	}
	int ans=1e9;
	for(int i=0;i<=h;i++)
	  for(int j=0;j<=h;j++)
	    if(j>=h-i) ans=min(ans,dp[n][i][j]);
	if(ans==1e9) ans=-1;
	cout<<ans<<endl;
	
	return 0;
}

标签:ABC,min,int,站点,320F,maxn,Fuel,dp,dis
From: https://www.cnblogs.com/lulu7/p/18244646

相关文章

  • 「杂题乱刷」AT_abc154_e
    代码恢复训练2024.6.10.(补)链接(luogu)链接(atcoder)数位dp板子题。dfs(last,sum,_1)剩下未搜的数位数,当前非零数位数,目前是否取满。这里采用记搜的写法。点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换......
  • 「杂题乱刷」AT_abc132_e
    代码恢复训练2024.6.11.链接(luogu)链接(atcoder)分层图板子。结束。代码:点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换题?打cf不要用umap!!!记住,rating是身外之物。该冲正解时冲正解!Problem:算......
  • 由AtCoder_ABC357D引发的除法同余学习
    鉴于最近的Atcoder周赛又出现除法求余,下定决心学习逆元相关内容同余概述定义同余定义:若a和b是整数,且m|(a-b),则称a和b模m同余。即两者除以m得到的余数相同。剩余系:一个模m完全剩余系是一个整数集合,任何一个整数恰好与该集合中的一个元素模m同余。例如0,1,...,m-1的集......
  • 《DSP开发》TMS320F28XX-ADC模块
    1.1、特征1.2、功能框图2.1、ADC模块配置1、ADC时钟使能。ADC时钟没有使能的话,后续对ADC相关寄存器的配置值虽然被写入,但实际不会生效。2、校准ADC参考、DAC偏移和内部振荡器。Device_cal();3、配置ADC模块转换误差、参考模式、参考基准、时钟分频、ADC中断触发时刻,最......
  • [ABC311G] One More Grid Task
    [ABC311G]OneMoreGridTask题目信息题面翻译给你一个\(n\timesm\)的矩阵\(a\),求:\[\max_{1\leql_1\leqr_1\leqn,1\leql_2\leqr_2\leqm}(\sum_{l_1\leqi\leqr_1,l_2\leqj\leqr_2}a_{i,j}\times\min_{l_1\leqi\leqr_1,l_2\leqj\leqr_2}a_{i......
  • ABC 315F Shortcuts
    题意有N个点,你从第一个点出发,要按顺序经过所有的点,最终抵达第N个点。在这个过程中你可以跳过一些点,但如果你跳过了C个点,那么你必须要接受pow(2,C-1)的惩罚。设s为你走过的距离加上你的惩罚,请求出最小化s。题解显然考虑dp,设计dp[i][j]为到达第i个点,中途跳过了j个点需要的路程。......
  • 低代码平台Crabc 企业版 2.3.0 发布
    介绍crabc-cloud 是低代码接口开发平台,企业级API管理系统,深度整合SpringCloud和Mybatis实现动态数据源和动态SQL。支持接入(mysql、oracle、postgresql、sqlserver、达梦、TiDB、es)等SQL或/NoSQL数据源,在编辑框内编写好SQL后即可快速生成Rest接口对外提供服......
  • abc--cf训练日常总结
    ABC最近遇到好多思维和位运算的题目不会做,特地过来总结一些小小的知识点。思维题目https://atcoder.jp/contests/abc353/tasks/abc353_c这道题目要求我们计算连续的两个相邻的数组元素之和。我一开始用暴力,后面换了种错误的思路就wa了。其实这道题目是求和,然后找到和大于1e8......
  • 「杂题乱刷」AT_abc357_f
    代码恢复训练2024.6.8.题目链接链接(atcoder)链接(luogu)解题思路数据结构板子题。设\(ans_i=a_i\timesb_i\)(\(a_i\)和\(b_i\)是此时的\(a_i,b_i\))。设\(f1(i,j)\)表示\(a_i+a_{i+1}+a_{i+2}+\dots+a_j\)的值。设\(f2(i,j)\)表示\(b_i+b_{i+......
  • ATcoder ABC 351 补题记录(A~F)
    A按照顺序直接模拟即可。#pragmaGCCoptimize(3)#include<bits/stdc++.h>#defineintlonglong#definepbpush_back#defineememplace_back#defineF(i,x,y)for(inti=x;i<=y;i++)#defineG(i,x,y)for(inti=x;i>=y;i--)#defineW(G,i,x)for(auto&i:G[x......