天天看點

PTA-520鑽石争霸賽題解【c/c++ 完整思路+代碼】

寫在前面:因為在家上課水了一學期的網課,最近開始着手複習(預習)。是以這次做這個比賽明顯感覺到有點生疏了,這東西還是得每天練一點保持一點手感。 1個小時八道題,我寫完前六道的時候記得時間隻剩24分鐘左右了,又花了點時間改第六題,導緻最後沒時間細看第七題。

7-1 考試周:

PTA-520鑽石争霸賽題解【c/c++ 完整思路+代碼】

思路:這題我記得我做的時候大緻看了下題沒太看懂,然後看了一下輸入輸出樣例發現就是除一下就行,代碼如下:

#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分)

PTA-520鑽石争霸賽題解【c/c++ 完整思路+代碼】

思路:這個題就是考察了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分)

PTA-520鑽石争霸賽題解【c/c++ 完整思路+代碼】

思路: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分)

PTA-520鑽石争霸賽題解【c/c++ 完整思路+代碼】

思路:這個我感覺很多人可能想複雜了,就簡簡單單兩個變量輸入後一加,然後轉化成字元串一個一個讀出來,整型轉字元串的函數很多,我這裡用了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分)

PTA-520鑽石争霸賽題解【c/c++ 完整思路+代碼】

思路:題目看起來有點難,其實就是兩個操作:

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分)

PTA-520鑽石争霸賽題解【c/c++ 完整思路+代碼】
PTA-520鑽石争霸賽題解【c/c++ 完整思路+代碼】

思路:這道題相當于前幾道就有點意思了,雖然也隻是模拟題,但是寫起來要注意的細節比較多。當時我送出後扣了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分)

PTA-520鑽石争霸賽題解【c/c++ 完整思路+代碼】

唉,時間不夠沒看這個題,1分都沒水到是真可惜。暫時不更這道題

7-8 三足鼎立 (25分)

PTA-520鑽石争霸賽題解【c/c++ 完整思路+代碼】

思路:最後做這個題沒多少時間了,

看了一下,随便拿兩個,判斷三個數能不能構成三角形

又看了一下,資料範圍很友好。

好,直接雙重循環偏分。

#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;
}
           
PTA-520鑽石争霸賽題解【c/c++ 完整思路+代碼】

隻水了16分。。。還可以。。

繼續閱讀