首页 > 其他分享 >集训——考前复习

集训——考前复习

时间:2024-02-05 21:01:13浏览次数:25  
标签:复习 考前 int 代码 long 点击 查看 集训 dis

1:最短路

链式前向星;

点击查看代码
int head[maxn],to[maxn],nxt[maxn],val[maxn],tot;
void add(int x,int y,int z){
	to[++tot]=y;
	val[tot]=z;
	nxt[tot]=head[x];
	head[x]=tot;
}

堆优化的dijkstra

点击查看代码
priority_queue<pair<int,int> >q;

void dijkstra(int s){
	memset(vis,0,sizeof(vis));
	memset(dis,0,sizeof(dis));
	dis[s]=maxn;
	q.push(make_pair(maxn,s));
	while(q.size()){
		int x=q.top().second;
		q.pop();
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=head[x];i;i=nxt[i]){
			int y=to[i],z=val[i];
			if(dis[y]<min(z,dis[x])){
				dis[y]=min(z,dis[x]);
				q.push(make_pair(dis[y],y));
			}
		}
	}

}

2:搜索

模板

点击查看代码
int Search(int k) {
 if (到目的地) 输出解; 
 else 
    for (i=1;i<=算符种数;i++) 
        if (满足条件) {
            保存结果;
            Search(k+1);
            恢复:保存结果之前的状态{回溯一步}
            }
        }

3树

二叉树转普通树

点击查看代码
//结构图存图
struct tree
{
	char data;
	int prt,lch,rch;
};tree a[10000];
int main(){
	cc();
	cout<<endl;
	return 0;
} 
void cc(){
	memset(a,0,sizeof(a));
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].data;
		int j,p;
		cin>>j;
		//第一个儿子变左儿子
		if(j!=0){
			a[i].lch=j;
			a[j].prt=i;
		}
		//其余儿子为右儿子
		p=j;
		while(j!=0)
		{
			cin>>j;
			if(j!=0){
				a[p].rch=j;
				a[j].prt=p;
				p=j;
			}
		}
	}
} 

二叉树的遍历

点击查看代码
void qian(int x){
	if(x!=0){
	cout<<a[x].data;
	qian(a[x].lch);
	qian(a[x].rch);
	}
}
void zhong(int x){
	if(x!=0){
		zhong(a[x].lch);
		cout<<a[x].data;
		zhong(a[x].rch);
	}
}
void hou(int x){
	if(x!=0){
		hou(a[x].lch);
		hou(a[x].rch);
		cout<<a[x].data;
	}
}

最优二叉树(哈夫曼树)

叶子之和为其根,n个叶子共组成2n-1的树

点击查看代码
#include<bits/stdc++.h>
using namespace std;
struct tree{//结构图存储
	long long data;
	long long lch,rch;
};
long long n,k;
tree a[200],b[200];
void init();
long long my_min();
long long my_max();
void min_huffman();
void max_huffman();
int main()
{
	init();
	max_huffman();
	min_huffman();
	cout<<a[2*n-1].data<<endl;
	cout<<b[2*n-1].data<<endl;
	return 0;
}
void init(){//输入
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].data;
		b[i].data=a[i].data;
	}
}
long long my_min(){//最小叶子节点
	long long temp=0x7fffffffffffffff;
	for(int i=1;i<=n;i++)
	{
		if(a[i].data<temp)
		{
			temp=a[i].data;
			k=i;
		}
	}
	a[k].data=0x7fffffffffffffff;
	return temp;
}
long long my_max(){//最大叶子节点
	long long temp=-1;
	for(int i=1;i<=n;i++)
	{
		if(b[i].data>temp)
		{
			temp=b[i].data;
			k=i;
		}
	}
	b[k].data=-1;
	return temp;
}
void min_huffman(){
	for(int i=n+1;i<=2*n-1;i++)
	{
		a[i].lch=my_min();
		a[i].rch=my_min();
		a[i].data=a[i].lch*a[i].rch+1;
		a[k].data=a[i].data;
	}
}
void max_huffman(){
	for(int i=n+1;i<=2*n-1;i++)
	{
		b[i].lch=my_max();
		b[i].rch=my_max();
		b[i].data=b[i].lch*b[i].rch+1;
		b[k].data=b[i].data;
	}
}

dp

个人理解:dp本质为暴力枚举 + 记忆化优化,以小边界带动整体,以点带面的逐级求值过程
个人dp方程理解:1:中间阶段转移情况联系实际 。2,点带面边界处理

背包板子

t[ ]:体积,v[ ]:价值

01背包

点击查看代码
for(int i=1;i<=m;i++)
		for(int j=n;j>=t[i];j--){//一定要倒序,保证dis[j-t[i]]在本次循环未更新
			dis[j]=max(dis[j],dis[j-t[i]]+v[i]);
			}

完全背包

点击查看代码
for(int i=1;i<=m;i++)
		for(int j=t[i];j<=n;j++){//这里为正序,因为物品有无数件
			dis[j]=max(dis[j],dis[j-t[i]]+v[i]);
			}

分组背包

点击查看代码
for(int i=1;i<=n;i++){
		int x,y,p; 
		scanf("%d%d%d",&x,&y,&p);
		q[p]++;         //p组数量++
		t[p][q[p]]=x;
		v[p][q[p]]=y;   //转换01背包
	}
	for(int i=1;i<=m;i++)
		for(int j=v;j>=1;j--){
			dis[i][j]=dis[i-1][j];
			for(int s=1;s<=q[i];s++){
				if(j>=t[i][s])
					dis[i][j]=max(dis[i][j],dis[i-1][j-t[i][s]]+v[i][s]);
			}
		}

背包变形

点击查看代码
//求叠加值种类/个数等问题,倒序遍历高度/重量等值,此时dis[i]表示i高度/重量可达到
for(int i=1;i<=n;i++)
		for(int j=1;j<=p[i];j++)
			for(int k=1000;k>=l[i];k--){
					if(dis[k-l[i]]){
						dis[k]=1;
				}
			}

线性dp

b[ ]:长度,a[ ],序列

最长上升序列

点击查看代码
for(i=1;i<=n;i++){
		b[i]=1;
		for(j=1;j<=i;j++){//j是否等于i根据题目分析
			if(a[i]>a[j] && b[j]+1>b[i]){
				b[i]=b[j]+1;
			}
		}
	}

最长下降序列

点击查看代码
for(i=n;i>=1;i--){//倒着的最长上升序列即为最长下降序列
		b[i]=1;
		for(j=i+1;j<=n;j++){
			if(a[i]>a[j] && b[j]+1>b[i]){
				b[i]=b[j]+1;
			}
		}
	}

区间dp

枚举长度,起点,断点

板子

点击查看代码
for(int l=2;l<=n;l++)
		for(int i=1;i+l-1<=m;i++){
			int j=i+l-1; 
			for(int k=i;k<j;k++){
				a[i][j]=min(a[i][j],a[i][k]+a[k+1][j]+具体数值);
			}
	}

环拆链

二倍长度枚举起点和长度;

点击查看代码
for(int i=1;i<=n;i++){
    scanf("%d",&ch[i],&f[i][i]);
    f[i+n][i+n]=f[i][i];
    }
for(int l=2;l<=n;l++)
   for (int i=1;i+l-1<=2*n;i++){
       int j=i+l-1;
       for(int k=i;k<j;k++){
          f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+具体数值);
        }
	}

标签:复习,考前,int,代码,long,点击,查看,集训,dis
From: https://www.cnblogs.com/dfxjlsx/p/18008808

相关文章

  • 2024牛客寒假算法基础集训营2(小白)
    A.TokitsukazeandBraceletCode:#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t--){inta,b,c,cnt=0;cin>>a>>b>>c;if(a>=150)cnt++;if(a>=200)......
  • 2024牛客寒假算法基础集训营2
    题目链接A.模拟#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;voidsolve(){intn;cin>>n;while(n--){inta,b,c;cin>>a>>b>>c;intans=0;if(a==150)ans+=1......
  • 2024初三年前集训测试3
    2024初三年前集训测试3\(T1\)夕景昨日\(90pts\)部分分\(10pts\):输出No。\(20pts\):\(2^{n}\)的\(DFS\)暴力枚举能得到的所有数,用map里进行判断。\(90pts\):输出Yes。正解观察到\(1\len\le100000,0\lea_{i}\le500000\)。猜测\(n\)到达一......
  • 2024.1.21 ~ 2024.2.2 集训总结
    集训大纲Week1:图论:拓扑排序、欧拉回路、二分图、最小生成树数据结构:并查集、堆、单调队列week2:图论:连通性数据结构:线段树图论拓扑排序将DAG上的点以关联性进行排序,得到一个有关联的枚举顺序。有了这种特别的枚举顺序,使得在DAG上DP的转移过程更加合理且有......
  • 2024牛客寒假算法基础集训营1 J 又鸟之亦心 题解
    Question2024牛客寒假算法基础集训营1J又鸟之亦心Solution挺好的一个题,给了我很多启发显然,先二分最大值\(D\),关键在于\(check\)怎么写考虑到两个人是相对的,第\(i\)次之后肯定有一个人在\(a_i\),具体是谁不重要,也不需要关注是怎么走过来的,我们需要去维护另外一个人可......
  • 寒假集训总结
    图论拓扑排序定义在一张图上,将所有节点排序,使得每个节点的父节点都在其前面出现。如果图上有环,则这张图没有拓扑序。模版(BFS)booltopo(){queue<int>q;for(inti=1;i<=n;i++)if(!deg[i])q.push(i);while(!q.empty()){cnt++;intu=q.f......
  • 2024牛客寒假算法基础集训营1 K 牛镇公务员考试 题解
    Question2024牛客寒假算法基础集训营1K牛镇公务员考试给出一张试卷有\(n\)道单选题,每道题用一个整数\(a_i\)和一个长度为\(5\)的字符串\(s_i\)表示,其中第\(i\)道题的题面为:第\(a_i\)道题的答案是()A.\(s_1\)B.\(s_2\)C.\(s_3\)D.\(s_4\)E.\(s_5\)问:正......
  • 东北师大附中 集训游记
    update文笔稚嫩谨慎观看。东北师大附中集训游记但是去的时候到处都在翻修(小声bb)。Day1早上一来就要先考试,太离谱了。根本没准备\(qaq\)。于是就开始刚题,第一题写了半天,感觉推出来的结论超级无敌对,但是却只拿了10分。第二题没思路,放弃了。第三题读完题也挺离谱,写了个......
  • 2024牛客寒假算法基础集训营1
    题目链接A.因为判断要素较少,直接条件模拟#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=2e5+10;voidsolve(){intn;cin>>n;strings;cin>>s;intD=0,F=0,S=0,d=0,f=0,ss=0;for(inti=0;i<s.size();i++){......
  • (坚持每天写算法)算法学习与复习part1基础算法1-13——位运算
    最近确实有在写算法,在写dp,之前学的时候不全,被计数,树型等dp折磨了一下。位运算是将重点放在数字的位上,通常作为辅助行动,比如状态dp,有的时候是为了节省时空复杂度而使用的。这是今天的题目: 位运算应用的情况除了上面讲的,还有单纯的位问题,上面的题目就是一个例......