PTA团体程序设计天梯赛-练习集 L3题目总结(不全)
Posted karshey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA团体程序设计天梯赛-练习集 L3题目总结(不全)相关的知识,希望对你有一定的参考价值。
模拟题
STL题
L3-002 特殊堆栈(两个vector)
#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)
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)
三维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)
没懂“题目假设每个山头最多有两个能听到它的临近山头”的意思,直接模板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)
要素过多的大杂烩属于是。
听说直接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 社交集群 并查集 解题报告