PTA-520钻石争霸赛题解【c/c++ 完整思路+代码】

写在前面:因为在家上课水了一学期的网课,最近开始着手复习(预习)。所以这次做这个比赛明显感觉到有点生疏了,这东西还是得每天练一点保持一点手感。 1个小时八道题,我写完前六道的时候记得时间只剩24分钟左右了,又花了点时间改第六题,导致最后没时间细看第七题。

7-1 考试周:

在这里插入图片描述
思路:这题我记得我做的时候大致看了下题没太看懂,然后看了一下输入输出样例发现就是除一下就行,代码如下:

#include<bits/stdc++.h>
using namespace std;
inline void read(int &x)
{
	int w=1;x=0;char ch=getchar();
	while(!isdigit(ch))	{if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))	x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	x*=w;
}
int a,b;
double x;
int main()
{
	read(a); read(b);
	x=a*1.0/b;
	printf("%d/%.1lf=%d",a,x,b);
}

7-2 真的恭喜你 (10分)

在这里插入图片描述
思路:这个题就是考察了if-else语句,看完题直接写就行了,代码如下:

#include<bits/stdc++.h>
using namespace std;
inline void read(int &x)
{
	int w=1;x=0;char ch=getchar();
	while(!isdigit(ch))	{if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))	x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	x*=w;
}
int a;
int main()
{
	read(a);
	if(a>=90)	printf("gong xi ni kao le %d fen!",a);
	else	printf("kao le %d fen bie xie qi!",a);
}

7-3 平均成绩 (10分)

在这里插入图片描述
思路:for循环模拟题,五个变量,总成绩,男成绩,男人数,女成绩,女人数。然后输出的时候注意判断就行了,因为我比赛的时候没想那么多,所以下面的代码你可能看起来感觉有点笨拙~哈哈哈。

#include<bits/stdc++.h>
using namespace std;
inline void read(int &x)
{
	int w=1;x=0;char ch=getchar();
	while(!isdigit(ch))	{if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))	x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	x*=w;
}
int cnt1,cnt2,n;
double sum,sum1,sum2;
int main()
{
	read(n);
	for(int i=0,x,y;i<n;i++)
	{
		read(x); read(y);
		sum+=y;
		if(x)	sum1+=y,cnt1++;
		else	sum2+=y,cnt2++;
	}
	printf("%.1lf ",sum*1.0/n);
	if(!cnt1)	{printf("X ");}
	else	printf("%.1lf ",sum1*1.0/cnt1);
	if(!cnt2)	{printf("X");}
	else	printf("%.1lf",sum2*1.0/cnt2);
	
}

7-4 古风A+B (15分)

在这里插入图片描述
思路:这个我感觉很多人可能想复杂了,就简简单单两个变量输入后一加,然后转化成字符串一个一个读出来,整型转字符串的函数很多,我这里用了to_string. 当然,如果你说你比赛的时候并不知道这些函数,也完全可以加完之后讲每一位存到一个整形数组里(负号不用存,特判一下)最后遍历输出就行了,代码如下:

#include<bits/stdc++.h>
using namespace std;
inline void read(int &x)
{
	int w=1;x=0;char ch=getchar();
	while(!isdigit(ch))	{if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))	x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	x*=w;
}
int a,b;
int main()
{
	read(a); read(b);
	a+=b;
	string s=to_string(a);
	for(int i=0;i<s.size();i++)
		cout<<s[i]<<endl;
	
}

7-5 猜近似数字 (15分)

在这里插入图片描述
思路:题目看起来有点难,其实就是两个操作:
1.位数一样不一样 不一样直接就是No
2.位数不一样的有几位 大于1位直接No
3.不一样的位数是否在1的范围内 不在直接No
什么?不是只有两个操作吗? 后两个可以同时处理,所以只有两个。
代码如下:

#include<bits/stdc++.h>
using namespace std;
inline void read(int &x)
{
	int w=1;x=0;char ch=getchar();
	while(!isdigit(ch))	{if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))	x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	x*=w;
}
string s,s1;
int main()
{
	cin>>s;
	int len=s.length();
	while(1)
	{
		cin>>s1;
		if(s1[0]=='-'&&s1[1]=='1')	break;
		if(s1.length()!=len)
		{
			puts("No");
			continue;
		}
		int cnt=0,flag=0;
		for(int i=0;i<len;i++)
		{
			if(s1[i]==s[i])	continue;
			if(s1[i]!=s[i])	cnt++;
			if(cnt>1)	{puts("No"); flag=1;break;}
			if(s1[i]+1!=s[i]&&s1[i]-1!=s[i])
			{
				puts("No");
				flag=1;break;
			}
		}
		if(!flag)	puts("Yes");
	}	
}

7-6 随机输一次 (20分)

在这里插入图片描述
在这里插入图片描述
思路:这道题相当于前几道就有点意思了,虽然也只是模拟题,但是写起来要注意的细节比较多。当时我提交后扣了2分,又改了一会儿没找到原因,最后比赛结束又给我加了两分(害,白耽误我这半天时间)。
分析:
1.如何存储这三个手势来方便输出赢或者输的手势。
2.如何判断他现在在第几个系统(因为每个系统赢的次数不一样,且是个环)
首先回答问题1.
最笨的办法就是直接if-else 再输出的时候if人家剪刀 就输出石头,以此类推。当然,这么写的话可想而知,只写个判断需要输出啥可能就要超多行。 然后我们也可以用一个字符串数组存储比如string s【】={“JianDao”,“ChuiZi”,“Bu”},然后利用他们的下标建立输赢关系。比如输入的是下标1,你输出的肯定是下标+1后的字符串。 还有一种解决办法是map,就是我比赛的时候用的一种方法,具体见下面代码。

然后回答问题2,
可以用一个数组存储所有系统的值,然后用一个下标来标记当前在哪个系统(我下面的代码用idx)。然后用一个取余操作可以表示出来这个环(具体见下面代码)。

#include<bits/stdc++.h>
using namespace std;
inline void read(int &x)
{
	int w=1;x=0;char ch=getchar();
	while(!isdigit(ch))	{if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))	x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	x*=w;
}
int n,a[110],cnt=1;
string s;
map<string,int>m1;
map<int,string>m2,m3;
int main()
{
m1["JianDao"]=1;m1["ChuiZi"]=2;m1["Bu"]=3;
m2[1]="ChuiZi";m2[2]="Bu";m2[3]="JianDao";
m3[1]="Bu";m3[2]="JianDao";m3[3]="ChuiZi";
	read(n);
	for(int i=1;i<=n;i++)	read(a[i]);
	int idx=1;
	while(1)
	{
		cin>>s;
		if(s[0]=='E')	break;
		if(cnt<=a[idx])
		{
			cout<<m2[m1[s]]<<endl;
			cnt++;
		}
		else
		{
			cnt=1;idx=(idx+1)%n;
			if(idx==0)	idx=n;
			cout<<m3[m1[s]]<<endl;
		}
	}
}

7-7 阶乘的非零尾数 (20分)

在这里插入图片描述
唉,时间不够没看这个题,1分都没水到是真可惜。暂时不更这道题

7-8 三足鼎立 (25分)

在这里插入图片描述
思路:最后做这个题没多少时间了,
看了一下,随便拿两个,判断三个数能不能构成三角形
又看了一下,数据范围很友好。
好,直接双重循环偏分。

#include<bits/stdc++.h>
using namespace std;
inline void read(int &x)
{
	int w=1;x=0;char ch=getchar();
	while(!isdigit(ch))	{if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))	x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	x*=w;
}
int a,b,x[10010],cnt;
int main()
{
	read(a);	read(b);
	for(int i=0;i<a;i++)	read(x[i]);
	for(int i=0;i<a;i++)
		for(int j=i+1;j<a;j++)
			if(x[i]+b>x[j]&&x[i]+x[j]>b&&x[j]+b>x[i])
				cnt++;
	cout<<cnt;
}

在这里插入图片描述
只水了16分。。。还可以。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章