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, 遇到问题欢迎一起交流沟通哈。
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈