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

Posted karshey

tags:

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

模拟题

L2-002 链表去重(链表模拟)

L2-002 链表去重
用两个数组分别表示键值和下一个结点来模拟链表。注意可能存在无重复键值的绝对值的情况。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e5+10;
int n,head;
map<int,int>mp;
int a[N],ne[N];//某个地址的键值、下一个地址 
struct node

	int v,d;
;
vector<node>ans1,ans2;
int main()

	cin>>head>>n;
	fir(i,1,n)
	
		int t;cin>>t;
		cin>>a[t]>>ne[t];
		//不能直接cin>>t>>a[t]>>ne[t]
		//因为不回车是输入不进t的(?) 
	
	int p=head;	
	//关键
	while(p!=-1)
			
		if(mp[abs(a[p])]==0)
		
			ans1.pb(a[p],p);
			mp[abs(a[p])]=1;
		
		else
		
			ans2.pb(a[p],p);
		
		p=ne[p];
	
	//后面都是输出,注意格式即可
	int t=0;
	printf("%05d %d",ans1[0].d,ans1[0].v);
	for(auto x:ans1)
	
		if(t)
		
			printf(" %05d\\n",x.d);
			printf("%05d %d",x.d,x.v);
		
		t++;
	
	cout<<" "<<-1<<endl;
	if(ans2.size())
	
		t=0;
		printf("%05d %d",ans2[0].d,ans2[0].v);
		for(auto x:ans2)
		
			if(t)
			
				printf(" %05d\\n",x.d);
				printf("%05d %d",x.d,x.v);
			
			t++;
		
		cout<<" "<<-1<<endl;
	
	return 0;

L2-008 最长对称子串(模拟+枚举)

L2-008 最长对称子串
枚举每一个中轴即可。

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

	getline(cin,a);
	int ans=1;
	for(int i=0;a[i];i++)
	
		//a[i]是中轴 
		int t=1;
		int j1=i-1,j2=i+1;
		while(j1>=0&&j2<a.size()&&a[j1]==a[j2])
		
			j1--;j2++;
			t+=2;
		
		ans=max(ans,t);
		
		//无中轴
		t=0;
		j1=i,j2=i+1;
		while(j1>=0&&j2<a.size()&&a[j1]==a[j2])
		
			j1--;j2++;
			t+=2;
		  
		 ans=max(ans,t);
	
	cout<<ans;
	return 0;

L2-018 多项式A除以B(模拟+注意范围)

L2-018 多项式A除以B

常规样例:18分。
第一个0 0 0.0 3分,第二个0 0 0.0 3分,两个都是0 0 0.0 1分,共25分。
要四舍五入后不是0,则范围在:大于等于0.05(四舍五入0.1),或小于等于-0.05(四舍五入-0.1)。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e5+10;
int n,m,m1,m2;
double a[N],b[N],c[N];//a[i]表示该指数对应的系数 
int main()

	cin>>n;
	//指数 系数
	fir(i,1,n)
	
		int x,y;cin>>x>>y;
		m1=max(x,m1);
		a[x]=y;
	 
	cin>>m;
	fir(i,1,m)
	
		int x,y;cin>>x>>y;
		m2=max(x,m2);
		b[x]=y;
	 
	
	int t1=m1,t2=m2;
	
	//核心 
	while(t1>=t2)
	
		double tt=a[t1]/b[t2];
		c[t1-t2]=tt;
		for(int i=t1,j=t2;j>=0;j--,i--) a[i]-=b[j]*tt;//核心中核心 
		while(abs(a[t1])<0.000001) t1--;//如果系数是0就不参加运算——否则会TLE 
	
	
	int f=0,sum1=0;
	for(int i=0;i<=m1;i++)
					
		if(c[i]>=0.05||c[i]<=-0.05) //找最大的系数 
		
			f=i;
			sum1++;
		
	 
	
	if(sum1)
	
		cout<<sum1;
		for(int i=f;i>=0;i--)
					
			if(c[i]>=0.05||c[i]<=-0.05) printf(" %d %.1f",i,c[i]);
		
	
	else printf("0 0 0.0");
	
	int ff=0,sum2=0;
	for(int i=0;i<=m2;i++)
			
		if(a[i]>=0.05||a[i]<=-0.05) //找最大的系数 
		
			ff=i;
			sum2++;
		
	 
	cout<<endl;
	
	if(sum2)
	
		cout<<sum2;
		for(int i=ff;i>=0;i--)
					
			if(a[i]>=0.05||a[i]<=-0.05) printf(" %d %.1f",i,a[i]);
		
	
	else printf("0 0 0.0");
	return 0;

L2-020 功夫传人(模拟+bfs)

L2-020 功夫传人

从根结点开始bfs即可。根的武功值是z,编号是0;

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e5+10;
int n;double z,r;
vector<int>g[N];
int d[N];//得道 
double a[N];
double anss;
struct node

	double v;
	int u;
;
void bfs()

	queue<node>q;
	q.push(z,0);
	while(q.size())
	
		node temp=q.front();
		q.pop();
		
		if(g[temp.u].size())
		
			for(auto x:g[temp.u])
			
				node t=temp.v*r,x;
				a[x]=temp.v*r;
				q.push(t);
			
		
		else
		
			anss+=temp.v*d[temp.u];
				
	

int main()

	cin>>n>>z>>r;
	r=100-r;
	r*=0.01;
	
	fir(i,0,n-1)
	
		int k;cin>>k;
		if(!k)
		
			cin>>d[i];
		
		while(k--)
		
			int t;cin>>t;
			g[i].pb(t);
		
	
	
	a[0]=z;
	bfs();	

	cout<<(int)anss;
	return 0;

L2-022 重排链表(模拟+分类)

L2-022 重排链表

在ij循环的时候,分别注意:i=j、n是偶数、n是奇数的情况。

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

	int now,v,ne;
;
vector<node>a,ans;
int main()

	cin>>head>>n;
	fir(i,1,n)
	
		int t;cin>>t;
		cin>>v[t]>>ne[t];
	
	int p=head;
	while(p!=-1)
	
		node temp=p,v[p];
		a.pb(temp);
		p=ne[p];
	
	int i=0,j=a.size()-1;
	while(1)//这里不能是i!=j 否则若只有一个就无法输出 
	
		ans.pb(a[j]);	
		if(j==i) break;//奇数	
		ans.pb(a[i]);
		j--;
		if(j==i) break;//偶数 
		i++;
	
	for(int i=0;i<ans.size();i++)
	
		if(i!=ans.size()-1) ans[i].ne=ans[i+1].now;
		else ans[i].ne=-1;
	
	for(auto x:ans)
	
		if(x.ne!=-1) printf("%05d %d %05d\\n",x.now,x.v,x.ne);
		else printf("%05d %d -1\\n",x.now,x.v);
	
	return 0;

L2-028 秀恩爱分得快(模拟+细心)

L2-028 秀恩爱分得快

纯纯模拟,但是有点坑。

  • 要string输入,因为可能输入-0表示女性。
  • 要先把所有的值存起来,输入两个数字后再判断是否要计算,不然会TLE。
  • 输出要按顺序,但其实不用排序,从小到大遍历,满足条件的输出即可。
#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=1e3+10;
int n,m;
double a[N][N];
vector<int>g[N];
int ge[N];
int toint(string a)

	int ans=0;
	for(int i=0;a[i];i++)
	
		if(a[i]>='0'&&a[i]<='9') ans=ans*10+a[i]-'0';
	
	return ans;

int main()

	cin>>n>>m;
	fir(i,1,m)
	
		int t;cin>>t;
		while(t--)
		
			string tt;cin>>tt;
			int ttt=toint(tt);
			if(tt[0]=='-') ge[ttt]=-1;
			else ge[ttt]=1;
			g[i].pb(ttt);
		
	
	string x,y;cin>>x>>y;
	int f1=0,f2=0;
	int xx=toint(x),yy=toint(y);
	if(x[0]=='-') f1=-1,f2=1;
	else f1=1,f2=-1;
	
	fir(i,1,m)
	
		int f=0;
		for(auto u:g[i])
		
			if(u==xx||u==yy) f=1;
		
		vector<int>bo,gi;
		if(f)//有 
		
			for(auto u:g[i])
			
				if(ge[u]==1) bo.pb(u);
				else gi.pb(u);
			
			for(auto u:bo)
				for(auto v:gi)
				
					a[u][v]+=以上是关于PTA团体程序设计天梯赛-练习集 L2题目总结(完)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

团体程序设计天梯赛-练习集L2-009 抢红包(25分)

PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集

PTA2022年蓝桥杯及天梯赛赛前训练(C++练习)