PTA团体程序设计天梯赛-练习集 L3题目总结(不全)

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA团体程序设计天梯赛-练习集 L3题目总结(不全)相关的知识,希望对你有一定的参考价值。

模拟题

STL题

L3-002 特殊堆栈(两个vector)

L3-002 特殊堆栈
参考

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e5+10;
int n;
vector<int>v,v1;//v有序 
int main()

	cin>>n;
	while(n--)
	
		string a;cin>>a;
		if(a=="Pop")
		
			if(v1.empty()) puts("Invalid");
			else
			
				int t=v1.back();
				auto it=lower_bound(v.begin(),v.end(),t);
				v.erase(it);
				cout<<t<<endl;
				v1.pop_back();
			
			
		
		else if(a=="PeekMedian")
		
			if(v1.empty()) puts("Invalid");
			else cout<<v[(v.size()+1)/2-1]<<endl;
		
		else
		
			int t;cin>>t;
			v1.pb(t);
			auto it=lower_bound(v.begin(),v.end(),t);
			v.insert(it,t);
		
	
	return 0;

dp题

搜索题

L3-001 凑零钱(dfs)

L3-001 凑零钱

dfs:从小到大排列,找到的第一个答案就是序列最小的答案。如果从大到小排列会TLE两个点。
也可以dp(01背包)。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e4+10;
int n,m,a[N],sum,fl;
vector<int>ans,anss;
void dfs(int u,int sum)

	if(fl) return;
	if(sum>m) return;
	if(sum==m)
	
		fl=1;
		anss=ans;
		return;
	
	for(int i=u;i<=n;i++)
	
		ans.pb(a[i]);
		dfs(i+1,sum+a[i]);
		ans.pop_back();
	

int main()

	cin>>n>>m;
	fir(i,1,n)
	
		cin>>a[i];sum+=a[i];
	
	if(sum<m) 
	
		cout<<"No Solution";return 0;
	
	
	sort(a+1,a+1+n);
	dfs(1,0);
	
	if(fl)
	
		int f=0;
		for(auto x:anss)
		
			if(f) cout<<" ";
			cout<<x;f++;
		
	
	else cout<<"No Solution";
	return 0;

L3-004 肿瘤诊断(bfs)

L3-004 肿瘤诊断

三维bfs。
dfs会段错误,估计是递归次数太多了。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1500+10;
int g[1300][130][80],v[1300][130][80];
int n,m,l,t;

int ans,temp;
int dx[6]=0,0,0,0,1,-1;
int dy[6]=0,0,1,-1,0,0;
int dz[6]=1,-1,0,0,0,0;
struct node

	int x,y,z;
;
void bfs(int x,int y,int z)
			
	queue<node>q;
	q.push(x,y,z);
	while(q.size())
	
		node t=q.front();q.pop();
		
		for(int i=0;i<6;i++)
		
			int xx=t.x+dx[i];
			int yy=t.y+dy[i];
			int zz=t.z+dz[i];
			if(xx>=1&&xx<=m&&yy>=1&&yy<=n&&zz>=1&&zz<=l)
			
				if(!v[xx][yy][zz]&&g[xx][yy][zz])
				
					v[xx][yy][zz]=1;
					temp++;
					q.push(xx,yy,zz);
				
			
		
	
	

int main()

	cin>>m>>n>>l>>t;
	
	fir(i,1,l)
		fir(j,1,m)
			fir(k,1,n)
				cin>>g[j][k][i];	
	
	fir(i,1,l)
		fir(j,1,m)
			fir(k,1,n)
			
				if(!v[j][k][i]&&g[j][k][i])
				
					temp=1;
					v[j][k][i]=1;
					bfs(j,k,i);
					if(temp>=t) ans+=temp;
				
			
	cout<<ans;
	return 0;

L3-008 喊山(bfs)

L3-008 喊山

没懂“题目假设每个山头最多有两个能听到它的临近山头”的意思,直接模板bfs一下。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=1e4+10;
int n,m,k;
vector<int>g[N]; 
struct node

	int a,ans;
;
int id,maxn;
int v[N];
int bfs(int x)

	memset(v,0,sizeof(v));
	queue<node>q;
	q.push(x,0);
	v[x]=1;
	id=-1,maxn=-1;
	while(q.size())
	
		node t=q.front();q.pop();
		
		for(auto u:g[t.a])
		
			if(v[u]) continue;
			v[u]=1;
			
			node temp=u,t.ans+1;
			if(t.ans+1>maxn)
			
				maxn=t.ans+1;
				id=u;
			
			else if(t.ans+1==maxn&&u<id)
			
				id=u;
						
			q.push(temp);			
		 
	
	return id;

int main()

	cin>>n>>m>>k;
	fir(i,1,m)
	
		int a,b;cin>>a>>b;
		g[a].pb(b);g[b].pb(a);
	
	while(k--)
	
		int kk;cin>>kk;
		int ans=bfs(kk);
		if(ans==-1) puts("0");
		else cout<<ans<<endl;
	
	return 0;

图论题

L3-011 直捣黄龙(dij+dfs+map)

L3-011 直捣黄龙

要素过多的大杂烩属于是。
听说直接dfs也可以满分,数据有点水。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define ll long long 
#define pb push_back
const int N=200+10;
int n,m;
string start,endd;
map<string,int>mp;
map<int,string>mpp;
int idx=1;
void add(string a)

	mp[a]=idx;
	mpp[idx]=a;
	idx++;

int p[N];//people
int g[N][N];
int ss,ee;//start end
int dist[N],st[N];

int dij()

	memset(dist,0x3f,sizeof(dist));
	dist[ss]=0;
	for(int i=1;i<=n;i++)
	
		int t=-1;
		for(int j=1;j<=n;j++)
		
			if(!st[j]&&(t==-1||dist[j]<dist[t]))
			
				t=j;
			
		
		
		st[t]=1;
		for(int j=1;j<=n;j++)
		
			dist[j]=min(dist[j],dist[t]+g[t][j]);
		
	
	
	return dist[ee];

int minn,all,killl;
vector<int>ans,temp;
int v[N];
void dfs(int u,int kill)

	if(u==ee)
	
		all++;
		if(temp.size()>ans.size())
		
			ans=temp;killl=kill;
		
		else if(temp.size()==ans.size()&&kill>killl) 
		
			killl=max(killl,kill);ans=temp;			
		
		return;
	
	for(int i=1;i<=n;i++)
	
		if(!v[i]&&dist[i]==dist[u]+g[u][i])
		
			v[i]=1;
			temp.pb(i);
			dfs(i,kill+p[i]);
			temp.pop_back();
			v[i]=0;
		
	

int main()

	cin>>n>>m>>start>>endd;
	add(start);add(endd);
	fir(i,1,n-1)
	
		string a;int b;cin>>a>>b;
		if(mp.find(a)==mp.end())
		
			add(a);			
		
		int t=

以上是关于PTA团体程序设计天梯赛-练习集 L3题目总结(不全)的主要内容,如果未能解决你的问题,请参考以下文章

团体程序设计天梯赛-练习集 L3-003 社交集群 并查集 解题报告

PTA团体程序设计天梯赛-练习集 25分的题

PTA L2-023 图着色问题-前向星建图 团体程序设计天梯赛-练习集

PTA 团体程序设计天梯赛 L3-020 至多删三个字符

团体程序设计天梯赛-练习集L2-007 家庭房产

PTA团体程序设计天梯赛题目集 L1-064 估值一亿的AI核心代码 (20分)