PAT乙级2021秋季题解

PAT乙级2021秋季题解

7-1 好数

原题

在这里插入图片描述

算法标签 模拟 排序 结构体

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100005;
struct MN{
    int nm;
    int a;
    int b;
}mn[N];
bool cmp(MN A, MN B){
    return A.nm<B.nm;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin>>n;
    while(n--){
        int num;
        int k=0;
        cin>>num;
        bool flag=false;
        for(int i=1;i<=100;++i){
            for(int j=i+1;j<=100;++j){
                if(i*i+i*j+j*j==num){
                    if(!flag){
                        flag = true;
                        cout<<"Yes"<<"\n";
                    }
                    cout<<i<<" "<<j<<"\n";
                }
                else{
                    if(!flag&&i*i+i*j+j*j-num>0){
                        mn[k].nm=i*i+i*j+j*j;
                        mn[k].a=i;
                        mn[k].b=j;
                        k++;
                    }
                }
            }
        }
        sort(mn,mn+k, cmp);
        if(!flag){
            cout<<"No"<<" "<<mn[0].nm<<"\n"<<mn[0].a<<" "<<mn[0].b<<"\n";
        }
    }
    return 0;
}

7-2 数以类聚

原题

在这里插入图片描述

算法标签 模拟 哈希

代码

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N = 100005;
map<int, int> mp;
int mul(int num){
    int sum=1;
    while(num){
        int n=num%10;
        sum*=n;
        num/=10;
    }
    return sum;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin>>n;
    for(int i=0;i<n;++i){
        int num;
        cin>>num;
        mp[mul(num)]++;
    }
    int mx=0,mxidx=0;
    for(auto mmp:mp){
        if(mmp.y>mx){
            mxidx = mmp.x;
            mx = mmp.y;
        }
    }
    cout<<mp.size()<< " "<<mxidx<<"\n";
    return 0;
}

7-3 自定义判题程序

原题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

算法标签 模拟

代码

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N = 100005;
bool solve(int k, string s, string s1, string s2){
    int cnt=0;
    string t="";
    for(int i=0;i<s2.size();++i){
        if(s2[i]-'0'!=0){
           cnt++;
           if(cnt>k){
               return false;
           }
        }
        if(s[i]==' '){
            return false;
        }
        if(s2[i]-'0'==0){
            t.push_back(s1[i]);
        }
        if(s2[i]-'0'==2){
            t+="*";
        }
        if(s2[i]-'0'==3){
            t+="*";
            t.push_back(s1[i]);
            t+="*";
        }
    }
    for(int i=0;i<t.size();++i){
        if(s[i]!=t[i]&&t[i]!='*'){
            return false;
        }
    }
    return true;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    string s,s1;
    getline(cin, s);
    getline(cin, s1);
    cin>>n;
    while(n--){
        int k;
        string s2;
        cin>>k>>s2;
        bool res=solve(k,s, s1, s2);
        
        if(res){
            cout<<"AC"<<"\n";
        }
        else{
            cout<<"WA"<<"\n";
        }
        
    }
    return 0;
    
}

这道题细节蛮多, 代码也存在问题

7-4 数组与链表

原题

在这里插入图片描述
在这里插入图片描述

算法标签 前缀和 模拟

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 10005; 
int b[N],l[N],a[N];
map<int, int> mp;
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;++i){
        cin>>b[i]>>l[i];
    }
    a[0]=l[0];
    for(int i=1;i<n;++i){
        a[i]=a[i-1]+l[i];
    }
    while(k--){
        int num;
        cin>>num;
        int t=-1;
        for(int i=0;i<n;++i){
            if(a[i]>num){
                t=i;
                break;
            }
        }
        if(t==-1){
            cout<<"Illegal Access"<<"\n";
        }
        else{
            mp[t]++;
            cout<<b[t]+(num-a[t-1])*4<<"\n";
        }
    }
    cout<<mp.size();
    return 0;
}

7-5取帽子

原题链接

在这里插入图片描述
在这里插入图片描述

算法标签 模拟 排序 结构体

代码

#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>

using namespace std;

int main(){

	int n; cin >> n;
	vector<int> hat, sorthat;
	vector<int> wei, sortwei;
	for (int i = 0; i < n; i++){
		int hat_; cin >> hat_;
		hat.push_back(hat_);
		sorthat.push_back(hat_);
	}
	sort(sorthat.begin(), sorthat.end());

	for (int i = 0; i < n; i++){
		int wei_; cin >> wei_;
		wei.push_back(wei_);
		sortwei.push_back(wei_);
	}
	sort(sortwei.begin(), sortwei.end());

	for (int i = n - 1; i >= 0; i--){
		int pos = lower_bound(sorthat.begin(), sorthat.end(), hat[i]) - sorthat.begin();
		for (int j = 0; j < n; j++){
			if (wei[j] == sortwei[pos]){
				if(i == 0) cout << j + 1;
				else cout << j + 1 << ' ';
				break;
			}
		}
	}

	return 0;
}

上述代码对于测试样例无问题(除第三题),可能存在bug, 遇到问题欢迎一起交流沟通哈。
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
请添加图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

飞滕人生TYF

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

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

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

打赏作者

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

抵扣说明:

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

余额充值