首页 > 其他分享 >Hetao P1178 冒险者 题解 [ 绿 ][ 最短路 ][ 线性 dp ]

Hetao P1178 冒险者 题解 [ 绿 ][ 最短路 ][ 线性 dp ]

时间:2024-04-07 20:47:31浏览次数:20  
标签:tmp int 题解 短路 Hetao bs dis dp tmp2

原题


题解

本蒟蒻采用的和大部分人解法不同,是根据当前标记值的总和跑最短路的一种解法。

思路 30min ,调代码 2h 的我太蒻了

首先观察题面可以发现本题求的是最少操作数,由于要求最小且有变化的过程,所以可以使用 dp 求解,也可以使用 最短路算法 求解,本篇先介绍最短路的算法。

其实作为图论来解还挺需要思维的。

建图

可以把本题抽象为以下的问题:

以编号为 \(\sum_{i = 1}^{n} a_i\) 的节点为起点,每次可以减去任何一个 \(a_i\) 并到达编号为这个数的节点,每个 \(a_i\) 最多可以减去一次;每次也可以加上一个 \(1\) 并到达编号为这个数的节点,有无限次数,任何边的权值都为 \(1\) ,求到达编号为 \(x\) 的倍数的节点的最短路。

实现

写题解的时候突然发现由于边权为 1 ,所以本题可以使用 bfs 用 \(O(n)\) 的时间进行求解,数据甚至可以更大一些。

但考试的时候没想那么多,就使用了 Dijkstra 算法,时间为 \(O(m \log m)\),由于边数可能比较多,因此不提前建出边来,而是对每个节点临时建边。看似复杂度很大,实际上有效边数并没有这么多,最大的数据也只跑了 13ms ,若用 bfs 可能会更少。

同时注意到每个数只能被减去一次,由于堆优化 dijkstra 的堆中每个情况是相对独立的,所以每个情况都要开额外的一个数组来存储每个数是否使用过,为了节省空间防止 MLE ,这里采用 bitset 来压缩空间。就是这里写错下标导致我调了 2h。

然后其他的就按照正常的最短路跑就行了。

代码

直接贺了赛时的 dijkstra 上去,什么时候有时间再来写 bfs 版和 dp 版的吧。

#include <bits/stdc++.h>
using namespace std;
int n,x;
int a[1005],start=0;
int dis[1001005];
bool vis[1001005];
struct node{
	bitset<1005>bs;
	int f,s;
}tmp,tmp2;
struct cmp{
	bool operator()(node b,node c)
	{
		return c.f<b.f;
	}
};
int dijkstra()
{
	memset(dis,0x3f,sizeof(dis));
	priority_queue<node,vector<node>,cmp> q;
	tmp.f=0,tmp.s=start;
	q.push(tmp);
	dis[start]=0;
	while(!q.empty())
	{
		tmp=q.top();
		q.pop();
		int oridis=tmp.f,u=tmp.s;
		if(u%x==0)
		{
			return dis[u];
		}
		if(vis[u])continue;
		vis[u]=1;
		for(int i=1;i<=n;i++)
		{
			if(tmp.bs[i]==0)
			{
				int v=u-a[i];
				if(dis[v]>oridis+1)
				{
					dis[v]=oridis+1;
					tmp2.f=dis[v],tmp2.s=v;
					tmp2.bs=tmp.bs;
					tmp2.bs[i]=1;//就是这个下标坑我2h
					q.push(tmp2);
				}
			}
		}
		int v=u+1;
		if(v<=start+1000 && dis[v]>oridis+1)//最多操作次数为1000次
		{
			dis[v]=oridis+1;
			tmp2.f=dis[v],tmp2.s=v;
			tmp2.bs=tmp.bs;
			q.push(tmp2);			
		}
	}
	return n;
}
int main()
{
	freopen("player.in","r",stdin);
	freopen("player.out","w",stdout);
	cin>>n>>x;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		start+=a[i];
	}
	int res=dijkstra();
	cout<<res;
	return 0;
}

标签:tmp,int,题解,短路,Hetao,bs,dis,dp,tmp2
From: https://www.cnblogs.com/zhr0102/p/18119822

相关文章

  • ABC218E Destruction题解
    ABC218EDestruction题解题意给你一个\(n\)个点\(m\)条边的带权无向联通图,你可以删去任意条边,要求保证图联通的情况下删去边的权值和最大。\((n\le2\cdot10^5\,\m\le2\cdot10^5\,\-10^9\lee_i\le10^9)\)(\(e_i\)为边权)分析首先我们考虑边权全为正的情况,那么我们删......
  • 【解题报告】RbOI Round 1,A&D题解
    【RbOIR1】A&D题解其他题题解请移步B、C点击图片跳转比赛:A.AnxiousRobin从左到右扫一遍,按照题意模拟即可。这里解释一下我的代码:因为只判断了六种字母,所以遇到-会直接过滤,无需特判。展开代码#include<bits/stdc++.h>#definelllonglong#defineMyWifeCrista......
  • 图的遍历试题解析
    一、单项选择题01.下列关于广度优先算法的说法中,正确的是(A ).Ⅰ.当各边的权值相等时,广度优先算法可以解决单源最短路径问题Ⅱ.当各边的权值不等时,广度优先算法可用来解决单源最短路径问题Ⅲ.广度优先遍历算法类似于树中的后序遍历算法Ⅳ.实现图的广度优先算法时,使用的......
  • 关于layui的单图片上传遇坑-field-input-name问题解决
    直接上代码注意field:'ymftimage'layui.use(function(){varupload=layui.upload;varlayer=layui.layer;varelement=layui.element;var$=layui.$;//单图片上传varuploadInst=upload.render({elem:'#ID-upload-demo-btn',......
  • QFComponent for lazarus增加新控件TQFGridPanelComponent
    TQFGridPanelComponent控件支持在单元格绑定可视控件,运行时单元格绑定的控件会吸附到相应的单元格里。|姓名|[#][C2]单位|办公地址|备注||:-:|:-:|:-:|:-:||秋风6|[bm4]检测中心1|南山建工村1|||秋风7|检测中心2|<COMPNAME=name3>[#][c4]南山建工村2|||[c2]地址|<COMPNAME=n......
  • ARC175 A~C 题解
    ARC175ASpoonTakingProblem题目大意有\(n\)个人围成一个环,第\(i\)个人左手边是第\(i\)个勺子,右手边是第\(i\%n+1\)个勺子。每个人的惯用手用一个字符\(a_i=\)L/R/?表示,即左手/右手/未知。给定\(1\simn\)的一个排列\(P_1,\dots,P_n\)表示这\(n\)个人行动的......
  • 货币系统—背包问题—python题解
    题目链接:货币系统题目描述:给定V种货币(单位:元),每种货币使用的次数不限。不同种类的货币,面值可能是相同的。现在,要你用这V种货币凑出N元钱,请问共有多少种不同的凑法。输入格式第一行包含两个整数V和N。接下来的若干行,将一共输入V个整数,每个整数表示一种货币的......
  • 5G网络建设【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-5G网络建设现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站,编号固定为1到N,接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通,不同基站之间架设光纤的成本各不相同,且有些节点之间已经存在光纤相连,请你设计算法,计算出能联通这些基站的最小成本是......
  • 项目排期【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目项目组共有N个开发人员,项目经理接到了M个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。假定各个需求直接无任何先后依赖关系,请设计算法帮助项目经理进行工作安排,使整个项目能用最少的时间交付。输入描述:第一行输入为M个需......
  • 找城市【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-找城市一张地图上有n个城市,城市和城市之间有且只有一条道路相连:要么直接相连,要么通过其它城市中转相连(可中转一次或多次)。城市与城市之间的道路都不会成环。当切断通往某个城市i的所有道路后,地图上将分为多个连通的城市群,设该城市i的聚集度为DPi(DegreeofP......