admin管理员组文章数量:1621659
这么就没练了来练练手,听说乙级都是水题暑假开始正式连前就先把乙级刷完吧,免得开始训练的时候手生,第一步计划是刷完乙级,然后开始水CF
题目在牛客网上刷的据说牛客上的数据比PAT官网要难点儿,放上传送门:牛客网PAT PAT官网
o(︶︿︶)o ,收回我的话,据说是不可信的,在牛客上全过的在官网有WA了9发,还是官网靠谱,明天奋斗找坑补题(ಥ _ ಥ)
随便说说
牛客上的三十道题目做完了,加起来差不多做了三个下午,真的是应了知乎上不知哪位说的,乙级最难到排序。乙级的题目用来练基础还是很不错的,虽然有的超级水不过就算是基础差点儿的所有的题目也应该是看看有思路的,最起码能拿到大分,乙级的话基本上稍微练练90+是没问题的,应陈越姥姥说的:“设立乙级还是因为有企业需要的,不是所有企业都要算法和英文很厉害的,能敲代码就是好娃”。具体的记不清楚了,大概就是这么个意思,身为一个ACMer感觉到了赤果果的嘲讽,so~,还是好好学英文去打甲级顶级吧
1001 害死人不偿命的(3n+1)猜想 (15)
思路:
可以递归也可以循环,递归算最简单
代码:
#include <iostream>
using namespace std;
int _3n(int n)
{
if(n==1) return 0;
if(n&1) return _3n((n*3+1)/2)+1;
else return _3n(n/2)+1;
}
int main()
{
int n;
cin>>n;
cout<<_3n(n)<<endl;
return 0;
}
1002 写出这个数 (20)
思路:
水题
代码:
#include <bits/stdc++.h>
using namespace std;
string shu[]={
"ling","yi","er","san","si","wu","liu","qi","ba","jiu","shi"};
int main()
{
char ch,num[100];
int sum=0;
while(~scanf("%c",&ch)&&ch!='\n')
{
sum+=ch-'0';
}
sprintf(num,"%d",sum);
cout<<shu[num[0]-'0'];
for(int i=1;i<strlen(num);i++)
{
cout<<' '<<shu[num[i]-'0'];
}
cout<<endl;
return 0;
}
1003 我要通过!(20)
思路:
字符串题目,一直都是比较弱也是怕的题目比较考验细心和耐心,这个要注意到题目上递推的关系
代码:
#include <bits/stdc++.h>
using namespace std;
int judge_1(char s[])
{
int l=strlen(s),p=1,t=1;
for(int i=0;i<l;i++)
{
if(!(s[i]=='P'||s[i]=='A'||s[i]=='T'))
return 0;
if(s[i]=='P')
{
if(p) p=0;
else return 0;
}
if(s[i]=='T')
{
if(t) t=0;
else return 0;
}
}
return 1;
}
int judge_2(char s[])
{
int l=strlen(s),p,t;
for(int i=0;i<l;i++)
{
if(s[i]=='P') p=i;
if(s[i]=='T') t=i;
}
if(t-p>1&&p*(t-p-1)==l-t-1)
{
return 1;
}
else return 0;
}
int judge(char s[])
{
return (judge_1(s)&&judge_2(s));
}
int main()
{
int n;
char s[105];
cin>>n;
while(n--)
{
scanf("%s",s);
if(judge(s))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
1004 成绩排名 (20)
思路:
直接比较
代码:
#include <iostream>
using namespace std;
int main()
{
string name_max,xh_max,name_min,xh_min,s,s2;
int max=-1,min=999,ans,n;
cin>>n;
while(n--)
{
cin>>s>>s2>>ans;
if(ans>max)
{
max=ans;
name_max=s;
xh_max=s2;
}
if(ans<min)
{
min=ans;
name_min=s;
xh_min=s2;
}
}
cout<<name_max<<' '<<xh_max<<endl<<name_min<<' '<<xh_min<<endl;
return 0;
}
1005 继续(3n+1)猜想 (25)
思路:
暴力
代码:
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
map<int ,int>mp;
int _3n(int n)
{
if(n==1) return 1;
if(n&1)
{
if(!mp[(n*3+1)/2]) mp[(n*3+1)/2]=_3n((n*3+1)/2);
return mp[(n*3+1)/2]+1;
}
else
{
if(!mp[n/2]) mp[n/2]=_3n(n/2);
return mp[n/2]+1;
}
}
int main()
{
int n,a[105],flag=1;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
mp[a[i]]=0;
}
sort(a,a+n);
for(int i=n-1;i>=0;i--)
{
_3n(a[i]);
}
for(map<int,int>::reverse_iterator it=mp.rbegin();it!=mp.rend();it++)
{
//cout<<"key:"<<it->first<<' '<<"ve:"<<it->second<<endl;
if(it->second==0)
{
if(flag)
{
cout<<it->first;
flag=0;
}
else
{
cout<<' '<<it->first;
}
}
}
cout<<endl;
return 0;
}
1006 换个格式输出整数 (15)
思路:
水
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
char s[5];
cin>>n;
sprintf(s,"%03d",n);
for(int i=0;i<s[0]-'0';i++) printf("B");
for(int i=0;i<s[1]-'0';i++) printf("S");
for(int i=0;i<s[2]-'0';i++) printf("%d",i+1);
cout<<endl;
return 0;
}
1007. 素数对猜想 (20)
思路:
水
代码:
#include <bits/stdc++.h>
using namespace std;
int judeg(int n)
{
for(int i=2;i<sqrt(n)+1;i++)
{
if(n%i==0) return 0;
}
return 1;
}
void init(int a[],int n)
{
int k=0;
for(int i=2;i<=n+1;i++)
{
if(judeg(i)) a[k++]=i;
}
}
int main()
{
int n,a[10005],sum=0;
cin>>n;
init(a,n);
for(int i=0;a[i+1]<=n;i++)
{
if(a[i+1]-a[i]==2) sum++;
}
cout<<sum<<endl;
return 0;
}
1008 数组元素循环右移问题 (20)
思路:
循环输出,不用储存
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k,a[105];
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=n-(k%n);i<2*n-(k%n);i++)
{
printf("%d%c",a[i%n],i==2*n-(k%n)-1?'\n':' ');
}
return 0;
}
1009 说反话 (20)
思路:
还是水,用一个string的栈存然后输出
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
stack<string>st;
string s;
while(cin>>s) st.push(s);
cout<<st.top();st.pop();
while(!st.empty())
{
cout<<' '<<st.top();
st.pop();
}
cout<<endl;
return 0;
}
1010 一元多项式求导 (25)
思路:
比较坑,题目上说的不清晰,输入的系数和质数都为0时什么都不输出,如果输入是空输出“0 0”。
代码:
#include <bits/stdc++.h>
using namespace std;
int flag=0;
void fx(int a,int b)
{
if(a*b)
{
if(flag) cout<<' '; flag=1;
printf("%d %d",a*b,b-1);
}
}
int main()
{
int a,b;
while(cin>>a>>b)
{
fx(a,b);
}
if(!flag) printf("0 0\n");
return 0;
}
1011 A+B和C (15)
思路:
水题不用思路
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long a,b,c;
int n;cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&a,&b,&c);
if((a+b)>c)
printf("Case #%d: true\n",i);
else
printf("Case #%d: false\n",i);
}
return 0;
}
1012 数字分类 (20)
思路:
按照要求分类就好,比较繁琐,写了无数if -_-!
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;cin>>n;
int a1=0,s1=0,a2=0,s2=0,a3=0,s3=0,a4=0,s4=0,a5=-0x3f3f3f3f,s5=0;
while(n--)
{
int ans;
cin>>ans;
switch(ans%5)
{
case 0:
if(!(ans%2))
{
a1+=ans;
s1++;
}
break;
case 1:
if(!(s2%2))
a2+=ans;
else
a2-=ans;
s2++;
break;
case 2:
s3++;
break;
case 3:
a4+=ans;
s4++;
break;
case 4:
a5=max(a5,ans);
s5++;
break;
}
}
if(!s1)
cout<<'N'<<' ';
else
cout<<a1<<' ';
if(!s2)
cout<<'N'<<' ';
else
cout<<a2<<' ';
if(!s3)
cout<<'N'<<' ';
else
cout<<s3<<' ';
if(!s4)
cout<<'N'<<' ';
else
printf("%.1lf ",a4*1.0/s4);
if(!s5)
cout<<'N'<<endl;
else
cout<<a5<<endl;
return 0;
}
1013 数素数 (20)
思路:
打表存1w个素数,筛法打表,普通方法不知道超不超,然后输出就好,隔是个要换行一次。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[104799]={
0},su[10005];
void init()
{
int k=0;
a[0]=a[1]=1;
for(int i=2;i<104799&&k<10005;i++)
{
if(!a[i])
{
su[k]=i;
k++;
for(int j=i+i;j<104799;j+=i)
{
a[j]=1;
}
}
}
}
int main()
{
init();
int n,m;
cin>>n>>m;
for(int i=n;i<=m;i++)
{
if((i-n+1)%10==0||i==m)
printf("%d\n",su[i-1]);
else
printf("%d ",su[i-1]);
}
return 0;
}
1014 福尔摩斯的约会 (20)
思路:
这个题略坑,刚开始理解错了两次都以为是顺序往下找相同的一对,结果只用两行上下对比是不是相同就行了。然后就是注意题目上的什么大写字母,字母,数字分清每一个要找那种相同的就行了
代码:
#include <bits/stdc++.h>
using namespace std;
string DAY[7]={
"MON","TUE","TUE","THU","FRI","SAT","SUN"};
int main()
{
char s[200],s2[100];
scanf("%s",s);
int l=strlen(s),l2,flag=0,hh,mm,day;
scanf("%s",s2);
l2=strlen(s2);
map<char, int>mp;
for(int i=0;i<l;i++)
mp[s[i]]=1;
for(int i=0;i<l2;i++)
{
if(s2[i]==s[i])
{
if(!flag&&s2[i]>='A'&&s2[i]<='Z')
{
flag=1;
day=s2[i]-'A';
}
else if(flag&&(s2[i]>='A'&&s2[i]<='N'||s2[i]>='0'&&s2[i]<='9'))
{
if(s[i]>='0'&&s[i]<='9')
hh = s2[i]-'0';
else
hh = s2[i]-'A'+10;
break;
}
}
}
scanf("%s",s);
l=strlen(s);
scanf("%s",s2);
l2=strlen(s2);
mp.clear();
for(int i=0;i<l;i++)
mp[s[i]]=1;
for(int i=0;i<l2;i++)
{
if(s2[i]==s[i]&&(s2[i]>='A'&&s2[i]<='Z'||s2[i]>='a'&&s2[i]<='z'))
{
mm=i;
break;
}
}
cout<<DAY[day];
printf(" %02d:%02d\n",hh,mm);
return 0;
}
1015 德才论 (25)
思路:
排序的题目,不过条件太多并且麻烦需要细心的分类和写cmp函数,定义一个结构体储存一个人的所有信息,只要分类和cmp函数没搞错,就直接用sort排序输出就行了。
代码:
#include <bits/stdc++.h>
using namespace std;
struct node{
int id,de,ca,lei,zong;
};
int cmp(node a,node b)
{
if(a.lei==b.lei)
{
if(a.zong==b.zong)
{
if(a.de==b.de)
return a.id<b.id;
return a.de>b.de;
}
return a.zong>b.zong;
}
return a.lei<b.lei;
}
int main()
{
int sum=0,n,l,h;
node a[100005],ans;
cin>>n>>l>>h;
while(n--)
{
scanf<
版权声明:本文标题:PAT乙级题解合集 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1728851130a1176692.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论