【PAT乙级+甲级题解】2022年秋季PAT乙级+甲级题解 By小柳 2022-9-4 19:00

17 篇文章 0 订阅
14 篇文章 5 订阅

感觉这次题挺简单的,两个小时左右的时候感觉甲级就有超过1/10的人满分了。我做了一下,不到三个小时就把乙级和甲级所有的题都过了😂。

7-1 计算数列第n项

a(n+1)为a(n)^3+1的各位数字之和。

#include <bits/stdc++.h>
using namespace std;
int n,a;
int main()
{
	cin>>a>>n;
	for(int i=1;i<=n;i++)
	{
		int m=a*a*a+1;
		a=0;
		while(m)
		{
			a+=m%10;
			m/=10; 
		}
	}
	cout<<a;
	return 0; 
}

7-2 AB变换

用a数组标记数字是否产生,a[i]为1表示产生了,0表示没产生;
用STL的set或者map也可以做。

#include <bits/stdc++.h>
using namespace std;
int a[100010],r;
int main()
{
	int m,k,n=0;
	cin>>m>>k;
	string s;
	cin>>s;
	for(int i=0;i<s.length();i++)
	{
		if(s[i]=='A')n/=4;
		else n=8*n+1;
		if(n<=k)a[n]=1;
	}
	for(int i=0;i<=k;i++)
	{
		if(a[i]==1)r++;
	}
	cout<<r;
	return 0;
}

7-3 中秋福利

暴力。

#include <bits/stdc++.h>
using namespace std;
struct s{
	string a;int b;
}s[10010];
int n,l,r,num,maxx,ma,mi=100000000;
int main() 
{
	cin>>n>>l>>r;
	for(int i=0;i<n;i++)
	{
		cin>>s[i].a>>s[i].b;
		if(s[i].b>=l&&s[i].b<=r)num++;
		if(s[i].b>maxx&&s[i].b<=r)maxx=s[i].b;
		if(s[i].b>ma)ma=s[i].b;
		if(s[i].b<mi)mi=s[i].b;
	}
	if(num)
	{
		cout<<num<<" "<<maxx<<endl;
		for(int i=0;i<n;i++)
		{
			if(s[i].b==maxx)cout<<s[i].a<<endl;
		}
	}
	else cout<<mi<<" "<<ma;
	return 0;
}

7-4 爆气球

7-1 Pseudo-completeness

身高为H的人平躺后能压到最多的气球;
因为求最小的坐标,所以遍历每个气球,看往左边H长度有多少个气球,使用二分。

#include <bits/stdc++.h>
using namespace std;
int n,h,a[100010],res,d;
int main()
{
	cin>>n>>h;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		int l=lower_bound(a,a+i,a[i]-h)-a;
		if(i-l+1>res)
		{
			res=i-l+1;
			d=a[i]-h;
		}
	}
	cout<<d<<" "<<res;
	return 0;
}

7-5 快排第二轮

7-2 The Second Run of Quicksort

判断序列是否是快排第二趟后的序列;
每一次快排会确定当前区间某一个元素的位置;
如果三个以上元素位置确定 或 两个元素位置确定并且包含第一个元素或最后一个元素中的其中一个,则为快排第二趟后的序列。

#include <bits/stdc++.h>
using namespace std;
int t,n,a[100010],b[100010],lmax[100010],rmin[100010],r;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		r=0;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			lmax[i]=max(lmax[i-1],a[i]);
			b[i]=a[i];
		}
		rmin[n+1]=1000000000;
		for(int i=n;i>=1;i--)
		{
			rmin[i]=min(rmin[i+1],a[i]);
		}
		sort(b+1,b+n+1);
		for(int i=1;i<=n;i++)
		{
			if(lmax[i]==a[i]&&rmin[i]==a[i]&&a[i]==b[i])r++;
		}
		if(r>=3||(r==2&&(a[1]==b[1]||a[n]==b[n])))printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

7-3 Leader of the Opinion Leaders

OLI为 关注他的人/他关注的人,如果超过T就是opinion leaders,找出被最多opinion leaders关注的opinion leaders;

暴力。

#include <bits/stdc++.h>
using namespace std;
int n,t,f[10010],ma;
vector<int>out[10010],in[10010],r;
int main()
{
	cin>>n>>t;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		while(x--)
		{
			int y;
			cin>>y;
			out[i].push_back(y);
			in[y].push_back(i);
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(in[i].size()/out[i].size()>=t)f[i]=1;
	}
	for(int i=1;i<=n;i++)
	{
		int m=0;
		for(auto j=in[i].begin();j!=in[i].end();j++)
		{
			if(f[*j]==1)m++;
		}
		if(f[i]==1&&m>ma)
		{
			ma=m;
			r.clear();
			r.push_back(i);
		}
		else if(f[i]==1&&m==ma)
		{
			r.push_back(i);
		}
	}
	for(auto i=r.begin();i!=r.end();i++)
	{
		if(i!=r.begin())cout<<" ";
		cout<<*i;
	}
	return 0;
}

7-4 Pseudo-completeness

perfect binary tree:每个非叶子结点都有两个孩子,左右叶子结点有相同的深度;
complete binary tree:除了最后一层,每一层都被填满,最有一层结点都靠左;
pseudo-complete binary tree:去掉底层后是perfect binary tree。

dfs,po[]保存后序遍历序列,d为层序遍历从左到右的序号(从0开始),f标记当前序号有无结点,maxD为最大深度;
从前往后找第一个没有被标记的序号:
①为n,且结点数量为2的n次方减1,则为perfect binary tree;
②为n,且结点数量不为2的n次方减1,则为complete binary tree;
③不为n,且在maxD减1层的结点之后,则为pseudo-complete binary tree。

#include <bits/stdc++.h>
using namespace std;
int pr[2010],in[2010],po[2010],f[2010],p,maxD;
void dfs(int x,int l,int r,int d,int le)
{
	if(l>r)return;
	f[d]=1;
	maxD=max(maxD,le);
	int i=l;
	while(pr[x]!=in[i])i++;
	dfs(x+1,l,i-1,d*2+1,le+1);
	dfs(x+1+(i-l),i+1,r,d*2+2,le+1);
	po[p++]=pr[x];
}
int main()
{
   int n;
   cin>>n;
   for(int i=1;i<=n;i++)cin>>in[i];
   for(int i=1;i<=n;i++)cin>>pr[i];
   dfs(1,1,n,0,1);
   for(int i=0;i<=n;i++)
   {
   	if(f[i]==0)
   	{
   		if(i==n&&log2(n+1)==(int)log2(n+1))cout<<1<<endl;
   		else if(i==n)cout<<2<<endl;
   		else if(i>=pow(2,maxD-1))cout<<3<<endl;
   		else cout<<0<<endl;
   		break;
   	}
   }
   for(int i=0;i<n;i++)
   {
   	if(i!=0)cout<<" ";
   	cout<<po[i];
   }
   return 0;
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柳学渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值