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(模拟+注意范围)
常规样例: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)
从根结点开始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 重排链表(模拟+分类)
在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 秀恩爱分得快(模拟+细心)
纯纯模拟,但是有点坑。
- 要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 图着色问题-前向星建图 团体程序设计天梯赛-练习集
PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集