首页 > 其他分享 >ABC 315F Shortcuts

ABC 315F Shortcuts

时间:2024-06-09 20:43:55浏览次数:17  
标签:node ABC 315F Shortcuts int maxn 跳跃 dp 个点

题意
有N个点,你从第一个点出发,要按顺序经过所有的点,最终抵达第N个点。在这个过程中你可以跳过一些点,但如果你跳过了C个点,那么你必须要接受pow(2,C-1)的惩罚。设s为你走过的距离加上你的惩罚,请求出最小化s。

题解
显然考虑dp,设计dp[i][j]为到达第i个点,中途跳过了j个点需要的路程。考虑到跳过惩罚为指数函数,那么跳跃的点一定不会太多,那么这样我们可以枚举j<=30即可。在状态转移的过程中我们考虑。当到达dp[i][j]时,我们要枚举的东西是:

  1. 第i个点由哪一个点j跳跃过来(max(1,i-30)<=j<i)
  2. 枚举已经跳跃的步数(注意,是“已经跳跃的步数”,因为从j跳跃到i是必然会跳一次的,所以我们要枚举的是已经跳跃的点),剩下的就是注意细节就行了,具体实现看代码

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e4+10;
double dp[maxn][100]; 

struct node
{
	int x,y;
}a[maxn];

double dis(node x,node y) 
{
   return sqrt(1.0*(x.x-y.x)*(x.x-y.x)+1.0*(x.y-y.y)*(x.y-y.y));
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	int n;
	cin>>n;
	const int mo=1;
	for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
	for(int i=1;i<=n;i++) for(int j=0;j<=30;j++) dp[i][j]=1e18;
	dp[1][0]=0;
	for(int i=2;i<=n;i++)//更新dp[i][j],表示到达第i个点跳跃j个点需要的路程 
	{
		for(int j=max(mo,i-30);j<=i-1;j++)//枚举跳跃点 
		{
			for(int k=0;k<=min(mo*30,i-1);k++)//枚举跳跃的步数 
			{
				if(k-(i-j)+1<0) continue;
				dp[i][k]=min(dp[i][k],dp[j][k-i+j+1]+dis(a[i],a[j]));
			}
		}
	}
	double ans=dp[n][0];
	int p=1;
	for(int i=1;i<=30;i++)
	{
		ans=min(ans,dp[n][i]+pow(2,i-1));
		p=p*2;
	}
	printf("%.7f",ans);
	
	return 0;
 } 

标签:node,ABC,315F,Shortcuts,int,maxn,跳跃,dp,个点
From: https://www.cnblogs.com/lulu7/p/18239967

相关文章

  • 低代码平台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......
  • [ABC354F] Useless for LIS
    写在最前面的话:如果你懂这道题的线段树或者树状数组解法,那么本题解对你可能没有帮助。题目传送门(Luogu)题目传送门(AtCoder)[ABC354F]UselessforLIS题面翻译给定一个长度为\(n\)的序列\(a\)。求出所有\(i\)使得存在任意一个\(a\)的最长上升子序列包含\(i\)。多测。......
  • 「杂题乱刷」AT_abc160_e
    代码康复训练2024.6.7无所谓,随便贪。直接取前\(x\)大的红苹果,前\(y\)大的绿苹果和和所有无色苹果合起来取最大的\(x+y\)个苹果的值加起来即可。容易证明一定合法。代码:点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出......
  • atcoder ABC 353-A题详解
    atcoderABC353-A题详解ProblemStatementThereareNbuildingsalignedinarow.Thei-thbuildingfromthelefthasaheightofHi.Determineifthereisabuildingtallerthanthefirstonefromtheleft.Ifsuchabuildingexists,findtheposition......
  • [ABC107D] Median of Medians 题解
    题目大意:一个长度为$M$的序列的中位数为这个序列从小到大排序后第$\lfloor\fracM2\rfloor+1$个数,将这个序列的所有子段的中位数放入一个序列中,求这个序列的中位数。设一个序列$a$的中位数为$x$,那么$a$中至少会有一半的数大于等于$x$,并且$x$是$a$中满足这个条件......
  • [ABC036D] 塗り絵 题解
    题意题面讲挺清楚的就不简化了。思路树上求方案数,很明显是树上dp。设$dp_{i,0/1}$表示第$i$个点涂成白/黑色的方案数。当前结点如果为白色,那么它的子节点涂成什么颜色都没关系,根据分步乘法原理,将它子结点涂成白/黑色的方案数之和乘起来即可;当前结点如果为黑色,那么它的子......
  • [ABC126D] Even Relation 题解
    题意对一棵有$N$个点,$N-1$条边的树进行黑白染色,使得每两个距离为偶数的点颜色都一致。思路首先让我们回顾一下加法的性质:偶$+$偶$=$偶奇$+$奇$=$偶偶$+$奇$=$奇不难看出,距离为偶数的关系是可以传递的,而距离为奇数的关系不行。我们只需要做一遍dfs,对一个......