17.7.24 校内赛 解题报告【二分答案】【记忆化搜索】【数据结构】

2024-03-28 14:58

本文主要是介绍17.7.24 校内赛 解题报告【二分答案】【记忆化搜索】【数据结构】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.计算几何
题目描述:

解题报告:
这道题有几个问题。
首先我们要解决,如何配对坐标轴上的点使得n条线段没有交点。由于题目的承诺,我们sort一遍就行了。
其次我们要搞出点在直线另一侧的判定方程,这个方程是:
b*y+a*x>=x*y
然后我们就会想,有没有优于n^2的方法来统计点在哪些线段的同侧。由于我们sort一遍之后这些线段是又内及外的,所以我们想到了二分。那么二分确定的方向是什么呢?由于我们想要答案尽量小,所以是向左移的方向。
代码如下:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define NAME "geometry"
const int N=1e5;
int n,m;
long long x_1,y_1;
long long x[N+5],y[N+5];
int main()
{freopen(NAME".in","r",stdin);freopen(NAME".out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&x[i]);for(int i=1;i<=n;i++)scanf("%d",&y[i]);sort(x+1,x+1+n);sort(y+1,y+1+n);scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d%d",&x_1,&y_1);int lf=1,rg=n;while(lf<=rg){int mid=(lf+rg)>>1;if(x[mid]*y_1+y[mid]*x_1>=x[mid]*y[mid])lf=mid+1;//判定是否相交 else rg=mid-1;}printf("%d\n",rg);}return 0;
}

2.花花的聚会
题目描述:

解题报告:
这道题题意就是叫我们找从在买票的前提下,从非根节点跑到根节点所需要的最小价值。
由于查询的过程中很肯能会经过重复的点,所以我们希望把找到的这些点到根节点的代价记下来。这也就是记忆画搜索的套路。
还有一些细节上的东西,就是我们用临界表存储这颗树是毫无意义的,还不如用一个简单的father数组就可以满足其转移的条件。那我们用临界表干什么呢?我们用它来存储通行券。这样就可以方便的便利能在一个城市买到的所有通行券。
代码如下:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define NAME "party"
const int N=1e5;
const int inf=1e9;
int head[N+5],num;
int father[N+5];
struct edge
{int k,w;int next;
}ed[N+5];
void build(int v,int k,int w)
{ed[++num].k=k;ed[num].w=w;ed[num].next=head[v];head[v]=num;
}
int n,m,q;
int dp[N+5];
int dfs(int u)
{if(u==1)return 0;if(dp[u]!=-1)return dp[u];//记忆化搜索 dp[u]=inf;for(int i=head[u];i!=-1;i=ed[i].next)//枚举这个城市能买到的通行券 {int tot=1,now=father[u],k=ed[i].k;while(now>=1&&tot<=k){dp[u]=min(dp[u],dfs(now)+ed[i].w);//dp方程 now=father[now];//保证限制条件逐步更新 tot++;}}return dp[u];
}
int main()
{freopen(NAME".in","r",stdin);freopen(NAME".out","w",stdout);memset(dp,-1,sizeof(dp));memset(head,-1,sizeof(head));scanf("%d%d",&n,&m);for(int i=1;i<=n-1;i++){int u,v;scanf("%d%d",&u,&v);father[u]=v;//一棵树记下father足够了 }for(int i=1;i<=m;i++){int v,k,w;scanf("%d%d%d",&v,&k,&w);build(v,k,w);//图里边存储的是通行券 }scanf("%d",&q);for(int i=1;i<=q;i++){int u;scanf("%d",&u);printf("%d\n",dfs(u));}return 0;
}
/*
7 7
3 1
2 1
7 6
6 3
5 3
4 3
7 2 3
7 1 1
2 3 5
3 6 2
4 2 4
5 3 10
6 1 20
3
5
6
7
*/

3.文本编辑器
题目描述:

解题报告:
这道题我的一个同学研究的比较透。
以上
2017.7.24

这篇关于17.7.24 校内赛 解题报告【二分答案】【记忆化搜索】【数据结构】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig