可爱精灵宝贝(贪心,搜索)

2024-03-21 15:50

本文主要是介绍可爱精灵宝贝(贪心,搜索),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

带有贪心思想的搜索,

我们很容易想到,对于自身来说,如果L---R区间已经走过,那么在最优策略下不会重复走

同时,每次我们都会找离本节点最近的点&&符合条件移动,

(假设我们当前不走,那么我们走到其他点才返回一定不优)

那么我们搜索的时间复杂度最大为2^100,又因为剪枝(L,R距离剪枝),是能水掉的啦啦啦...

当然用DP做也行,我考试为啥要打状压????????????

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<set>
 8 #include<vector>
 9 #include<map>
10 #include<queue>
11 #define MAXN 6101
12 #define int long long
13 using namespace std;
14 int a[MAXN],b[MAXN],t[MAXN];
15 int dis[MAXN][MAXN];
16 int n,k,m;
17 int sum=0;
18 void find(int pos,int l,int r,int time,int ans)
19 {
20      sum=max(ans,sum);
21      if(time>2000)return ;
22      //printf("pos=%lld l=%lld r=%lld time=%lld ans=%lld\n",pos,l,r,time,ans);
23      for(int i=pos-1;i>=1;--i)
24      {
25          if(a[i]>=l&&a[i]<=r)continue;
26          if(dis[pos][i]+time>t[i])continue;
27          find(i,min(a[i],l),max(r,a[i]),time+dis[pos][i],ans+b[i]);
28          break;
29      }
30      for(int i=pos+1;i<=m;++i)
31      {
32          if(a[i]>=l&&a[i]<=r)continue;
33          if(dis[pos][i]+time>t[i])continue;
34          find(i,min(l,a[i]),max(a[i],r),time+dis[pos][i],ans+b[i]);
35          break;
36      }
37      return ;
38 }
39 signed main()
40 {
41      scanf("%lld%lld%lld",&n,&k,&m);
42      for(int i=1;i<=m;++i)
43      {
44          scanf("%lld%lld%lld",&a[i],&b[i],&t[i]);
45      }
46      for(int i=1;i<=m;++i)
47      {
48          for(int j=1;j<=m;++j)
49          {
50               dis[i][j]=abs(a[i]-a[j]);
51          }
52      }
53      int l=0,r=0;
54      for(int i=1;i<=m;++i)
55      if(a[i]<=k&&abs(a[i]-k)+1<=t[i])l=i;  
56      for(int i=m;i>=1;--i)
57      if(a[i]>=k&&abs(a[i]-k)+1<=t[i])r=i;
58      if(l!=0)
59      find(l,min(a[l],k),max(a[l],k),abs(a[l]-k)+1,b[l]);
60      if(r!=0)
61      find(r,min(a[r],k),max(a[r],k),abs(a[r]-k)+1,b[r]);     
62      printf("%lld\n",sum);
63 }
View Code

 

转载于:https://www.cnblogs.com/Wwb123/p/11342655.html

这篇关于可爱精灵宝贝(贪心,搜索)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/833096

相关文章

Linux 下的Vim命令宝贝

vim 命令详解(转自:https://www.cnblogs.com/usergaojie/p/4583796.html) vi: Visual Interface 可视化接口 vim: VI iMproved VI增强版 全屏编辑器,模式化编辑器 vim模式: 编辑模式(命令模式)输入模式末行模式 模式转换: 编辑-->输入: i: 在当前光标所在字符的前面,转为输入模式

【文末附gpt升级秘笈】腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑

腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)和机器学习(ML)在各行各业的应用日益广泛。其中,AI搜索解析能力作为信息检索和知识抽取的核心技术,受到了广泛的关注和研究。腾讯作为互联网行业的领军企业,其在AI领域的探索和创新一直走在前列。近日,腾讯旗下的AI大模型应用——腾讯元宝,迎来了1.1.7版本的升级,新版本在AI搜

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树

LeetCode 62.不同路径 题目链接:62.不同路径 踩坑:二维的vector数组需要初始化,否则会报错访问空指针 思路: 确定动态数组的含义:dp[i][j]:到达(i,j)有多少条路经递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]初始化动态数组:dp[0][0] = 1遍历顺序:从左到右,从上到下 代码: class Solution {pu

leetcode刷题(45)——35. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [

【智能优化算法改进策略之局部搜索算子(五)—自适应Rosenbrock坐标轮换法】

1、原理介绍 作为一种有效的直接搜索技术,Rosenbrock坐标轮换法[1,2]是根据Rosenbrock著名的“香蕉函数”的特点量身定制的,该函数的最小值位于曲线狭窄的山谷中。此外,该方法是一种典型的基于自适应搜索方向集的无导数局部搜索技术。此法于1960年由Rosenbrock提出,它与Hooke-Jeeves模式搜索法有些类似,但比模式搜索更为有效。每次迭代运算分为两部分[3]: 1)

Day59 代码随想录打卡|二叉树篇---把二叉搜索树转换为累加树

题目(leecode T538): 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。 方法:本题

智能优化算法改进策略之局部搜索算子(六)--进化梯度搜索

1、原理介绍     进化梯度搜索(Evolutionary Gradient Search, EGS)[1]是兼顾进化计算与梯度搜索的一种混合算法,具有较强的局部搜索能力。在每次迭代过程中,EGS方法首先用受进化启发的形式估计梯度方向,然后以最陡下降的方式执行实际的迭代步骤,其中还包括步长的自适应,这一过程的总体方案如下图所示:     文献[1]

yii2 模糊搜索,使索引生效

$str1 = ‘名称’; $str2 = ‘描述’; Course::find() // %这样放,可以使name索引(设置了索引的话。同时false不能删掉,否则索引失效)生效 ->where([‘LIKE’, ‘name’, $str1.’%’, false]) ->andWhere([‘status’=>1]) // %这样放,可以使desc索引(设置了索引的话。同时false不能删掉,否

openjudge_2.5基本算法之搜索_8783:单词接龙

概要 8783:单词接龙 总时间限制: 1000ms 内存限制: 65536kB 描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含

智能优化算法改进策略之局部搜索算子(三)—二次插值法

1、原理介绍 多项式是逼近函数的一种常用工具。在寻求函数极小点的区间(即寻查区间)上,我们可以利用在若干点处的函数值来构成低次插值多项式,用它作为求极小点的函数的近似表达式,并用这个多项式的极小点作为原函数极小点的近似。低次多项式的极小点比较容易计算。常用的插值多项式为二次或三次,一般说来三次插值公式的收敛性好一些,但在导数不变计算时,三点二次插值也是一种常用的方法[1]。 3