寫在前面:因為在家上課水了一學期的網課,最近開始着手複習(預習)。是以這次做這個比賽明顯感覺到有點生疏了,這東西還是得每天練一點保持一點手感。 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分。。。還可以。。