L1-061 新胖子公式 (10 分)
根據錢江晚報官方微博的報導,最新的肥胖計算方法為:體重(kg) / 身高(m) 的平方。如果超過 25,你就是胖子。於是本題就請你編寫程序自動判斷一個人到底算不算胖子。
輸入格式
輸入在一行中給出兩個正數,依次為一個人的體重(以 kg 為單位)和身高(以 m 為單位),其間以空格分隔。其中體重不超過 \(1000\) kg,身高不超過 \(3.0\) m。
輸出格式
首先輸出將該人的體重和身高代入肥胖公式的計算結果,保留小數點后 \(1\) 位。如果這個數值大於 \(25\),就在第二行輸出 PANG
,否則輸出 Hai Xing
。
輸入樣例 1
100.1 1.74
輸出樣例 1
33.1
PANG
輸入樣例 2
65 1.70
輸出樣例 2
22.5
Hai Xing
作者:陳越
單位:浙江大學
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
PZ.cpp
using namespace std;
double kg,m,bmi;
int main(){
scanf("%lf %lf",&kg,&m);
printf("%.1lf\n",bmi=kg/(m*m));
if(bmi>25) puts("PANG");
else puts("Hai Xing");
return 0;
}
L1-062 幸運彩票 (15 分)
彩票的號碼有 6 位數字,若一張彩票的前 3 位上的數之和等於后 3 位上的數之和,則稱這張彩票是幸運的。本題就請你判斷給定的彩票是不是幸運的。
輸入格式
輸入在第一行中給出一個正整數 N(≤ 100)。隨后 N 行,每行給出一張彩票的 6 位數字。
輸出格式
對每張彩票,如果它是幸運的,就在一行中輸出 You are lucky!
;否則輸出 Wish you good luck.
。
輸入樣例
2
233008
123456
輸出樣例
You are lucky!
Wish you good luck.
作者:陳越
單位:浙江大學
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
PZ.cpp
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
int n;
scanf("%d",&n);
while(n--){
string s;
cin>>s;
if(s[0]+s[1]+s[2] == s[3]+s[4]+s[5]) puts("You are lucky!");
else puts("Wish you good luck.");
}
return 0;
}
L1-063 吃魚還是吃肉 (10 分)
國家給出了 \(8\) 歲男寶寶的標准身高為 \(130\) 厘米、標准體重為 \(27\) 公斤;\(8\) 歲女寶寶的標准身高為 \(129\) 厘米、標准體重為 \(25\) 公斤。
現在你要根據小寶寶的身高體重,給出補充營養的建議。
輸入格式
輸入在第一行給出一個不超過 \(10\) 的正整數 \(N\),隨后 \(N\) 行,每行給出一位寶寶的身體數據:
性別 身高 體重
其中性別
是 \(1\) 表示男生,\(0\) 表示女生。身高
和體重
都是不超過 \(200\) 的正整數。
輸出格式
對於每一位寶寶,在一行中給出你的建議:
- 如果太矮了,輸出:
duo chi yu!
(多吃魚); - 如果太瘦了,輸出:
duo chi rou!
(多吃肉); - 如果正標准,輸出:
wan mei!
(完美); - 如果太高了,輸出:
ni li hai!
(你厲害); - 如果太胖了,輸出:
shao chi rou!
(少吃肉)。
先評價身高,再評價體重。兩句話之間要有 \(1\) 個空格。
輸入樣例
4
0 130 23
1 129 27
1 130 30
0 128 27
輸出樣例
ni li hai! duo chi rou!
duo chi yu! wan mei!
wan mei! shao chi rou!
duo chi yu! shao chi rou!
作者:陳越
單位:浙江大學
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
PZ.cpp
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
int n,S,H,W;
scanf("%d",&n);
while(n--){
scanf("%d %d %d",&S,&H,&W);
if(S==1){
if(H<130) printf("duo chi yu! ");
if(H==130) printf("wan mei! ");
if(H>130) printf("ni li hai! ");
if(W<27) printf("duo chi rou!\n");
if(W==27) printf("wan mei!\n");
if(W>27) printf("shao chi rou!\n");
}
if(S==0){
if(H<129) printf("duo chi yu! ");
if(H==129) printf("wan mei! ");
if(H>129) printf("ni li hai! ");
if(W<25) printf("duo chi rou!\n");
if(W==25) printf("wan mei!\n");
if(W>25) printf("shao chi rou!\n");
}
}
return 0;
}
L1-064 估值一億的AI核心代碼 (20 分)
以上圖片來自新浪微博。
本題要求你實現一個稍微更值錢一點的 AI 英文問答程序,規則是:
- 無論用戶說什么,首先把對方說的話在一行中原樣打印出來;
- 消除原文中多余空格:把相鄰單詞間的多個空格換成 \(1\) 個空格,把行首尾的空格全部刪掉,把標點符號前面的空格刪掉;
- 把原文中所有大寫英文字母變成小寫,除了
I
; - 把原文中所有獨立的
can you
、could you
對應地換成I can
、I could
—— 這里“獨立”是指被空格或標點符號分隔開的單詞; - 把原文中所有獨立的
I
和me
換成you
; - 把原文中所有的問號
?
換成驚嘆號!
; - 在一行中輸出替換后的句子作為 AI 的回答。
輸入格式
輸入首先在第一行給出不超過 \(10\) 的正整數 N,隨后 N 行,每行給出一句不超過 \(1000\) 個字符的、以回車結尾的用戶的對話,對話為非空字符串,僅包括字母、數字、空格、可見的半角標點符號。
輸出格式
按題面要求輸出,每個 AI 的回答前要加上 AI:
和一個空格。
輸入樣例
6
Hello ?
Good to chat with you
can you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know
輸出樣例:
Hello ?
AI: hello!
Good to chat with you
AI: good to chat with you
can you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know
作者:陳越
單位:浙江大學
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
本題的模擬略微復雜,代碼可能比較凌亂,請見諒;
PZ.cpp
#include<cstdio>
#include<iostream>
#include<sstream>
using namespace std;
int n;
void work2(string &s){
for(int i=0;i<s.size();++i)
if('A'<=s[i] && s[i]<='Z' && s[i]!='I') s[i]=s[i]-'A'+'a';
}
string work1(string s){
istringstream iss(s);
string tmp,res;
bool f=0;
while(getline(iss,tmp,' ')){
if(tmp=="") continue;
work2(tmp);
if(!f) res+=tmp,f=1;
else res+=" "+tmp;
}
return res;
}
bool isabc(char x){ return x=='I' || 'a'<=x && x<='z' || '0'<=x && x<='9'; }
void work3(string s){
for(int i=0;i<s.size();++i){
if((i==0 || !isabc(s[i-1])) && (s[i]=='I') && !isabc(s[i+1])) cout<<"you";
else if((i==0 || !isabc(s[i-1])) && s[i]=='m' && s[i+1]=='e' && !isabc(s[i+2])) cout<<"you",++i;
else if((i==0 || !isabc(s[i-1])) && s[i]=='c' && s[i+1]=='a' && s[i+2]=='n' && s[i+3]==' ' && s[i+4]=='y' && s[i+5]=='o' && s[i+6]=='u' && !isabc(s[i+7])) cout<<"I can",i+=6;
else if((i==0 || !isabc(s[i-1])) && s[i]=='c' && s[i+1]=='o' && s[i+2]=='u' && s[i+3]=='l' && s[i+4]=='d' && s[i+5]==' ' && s[i+6]=='y' && s[i+7]=='o' && s[i+8]=='u' && !isabc(s[i+9])) cout<<"I could",i+=8;
else if(s[i]=='?') cout<<'!';
else if(s[i]==' ' && !isabc(s[i+1])) continue;
else cout<<s[i];
}
puts("");
}
int main(){
scanf("%d",&n); getchar();
while(n--){
string s;
getline(cin,s);
cout<<s<<endl;
s=work1(s);
cout<<"AI: ";
work3(s);
}
return 0;
}
L1-065 嫑廢話上代碼 (5 分)
Linux 之父 Linus Torvalds 的名言是:“Talk is cheap. Show me the code.”(嫑廢話,上代碼)。本題就請你直接在屏幕上輸出這句話。
輸入格式
本題沒有輸入。
輸出格式
在一行中輸出 Talk is cheap. Show me the code.
。
輸入樣例
無
輸出樣例
Talk is cheap. Show me the code.
作者:陳越
單位:浙江大學
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
PZ.cpp
#include<cstdio>
using namespace std;
int main(){
printf("Talk is cheap. Show me the code.");
return 0;
}
L1-066 貓是液體 (5 分)
測量一個人的體積是很難的,但貓就不一樣了。因為貓是液體,所以可以很容易地通過測量一個長方體容器的容積來得到容器里貓的體積。本題就請你完成這個計算。
輸入格式
輸入在第一行中給出 \(3\) 個不超過 \(100\) 的正整數,分別對應容器的長、寬、高。
輸出格式
在一行中輸出貓的體積。
輸入樣例
23 15 20
輸出樣例
6900
作者:陳越
單位:浙江大學
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
PZ.cpp
#include<cstdio>
using namespace std;
int main(){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
printf("%d",x*y*z);
return 0;
}
L1-067 洛希極限 (10 分)
科幻電影《流浪地球》中一個重要的情節是地球距離木星太近時,大氣開始被木星吸走,而隨着不斷接近地木“剛體洛希極限”,地球面臨被徹底撕碎的危險。但實際上,這個計算是錯誤的。
洛希極限(Roche limit)是一個天體自身的引力與第二個天體造成的潮汐力相等時的距離。當兩個天體的距離少於洛希極限,天體就會傾向碎散,繼而成為第二個天體的環。它以首位計算這個極限的人愛德華·洛希命名。(摘自百度百科)
大天體密度與小天體的密度的比值開 \(3\) 次方后,再乘以大天體的半徑以及一個倍數(流體對應的倍數是 \(2.455\),剛體對應的倍數是 \(1.26\)),就是洛希極限的值。例如木星與地球的密度比值開 \(3\) 次方是 \(0.622\),如果假設地球是流體,那么洛希極限就是 \(0.622×2.455=1.52701\) 倍木星半徑;但地球是剛體,對應的洛希極限是 \(0.622×1.26=0.78372\) 倍木星半徑,這個距離比木星半徑小,即只有當地球位於木星內部的時候才會被撕碎,換言之,就是地球不可能被撕碎。
本題就請你判斷一個小天體會不會被一個大天體撕碎。
輸入格式
輸入在一行中給出 \(3\) 個數字,依次為:大天體密度與小天體的密度的比值開 \(3\) 次方后計算出的值(\(≤1\))、小天體的屬性(\(0\) 表示流體、\(1\) 表示剛體)、兩個天體的距離與大天體半徑的比值(\(>1\) 但不超過 \(10\))。
輸出格式
在一行中首先輸出小天體的洛希極限與大天體半徑的比值(輸出小數點后\(2\)位);隨后空一格;最后輸出 ^_^
如果小天體不會被撕碎,否則輸出 T_T
。
輸入樣例 1
0.622 0 1.4
輸出樣例 1
1.53 T_T
輸入樣例 2
0.622 1 1.4
輸出樣例 2
0.78 ^_^
作者:陳越
單位:浙江大學
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
PZ.cpp
#include<cstdio>
using namespace std;
int main(){
double x,y,z,ans;
scanf("%lf %lf %lf",&x,&y,&z);
ans=x*(y==0 ? 2.455 : 1.26);
printf("%.2lf ",ans);
if(ans<z) puts("^_^"); else puts("T_T");
return 0;
}
L1-068 調和平均 (10 分)
\(N\) 個正數的算數平均是這些數的和除以 \(N\),它們的調和平均是它們倒數的算數平均的倒數。本題就請你計算給定的一系列正數的調和平均值。
輸入格式
每個輸入包含 \(1\) 個測試用例。每個測試用例第 \(1\) 行給出正整數 \(N (≤1000)\);第 \(2\) 行給出 \(N\) 個正數,都在區間 \([0.1,100]\) 內。
輸出格式
在一行中輸出給定數列的調和平均值,輸出小數點后\(2\)位。
輸入樣例
8
10 15 12.7 0.3 4 13 1 15.6
輸出樣例
1.61
作者:陳越
單位:浙江大學
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
PZ.cpp
#include<cstdio>
using namespace std;
int main(){
int n;
double sum=0;
scanf("%d",&n);
for(int i=1;i<=n;++i){
double x;
scanf("%lf",&x);
sum+=1/x;
}
printf("%.2lf",1/(sum/n));
return 0;
}
L1-069 胎壓監測 (15 分)
小轎車中有一個系統隨時監測四個車輪的胎壓,如果四輪胎壓不是很平衡,則可能對行車造成嚴重的影響。
讓我們把四個車輪 —— 左前輪、右前輪、右后輪、左后輪 —— 順次編號為 1、2、3、4。本題就請你編寫一個監測程序,隨時監測四輪的胎壓,並給出正確的報警信息。報警規則如下:
- 如果所有輪胎的壓力值與它們中的最大值誤差在一個給定閾值內,並且都不低於系統設定的最低報警胎壓,則說明情況正常,不報警;
- 如果存在一個輪胎的壓力值與它們中的最大值誤差超過了閾值,或者低於系統設定的最低報警胎壓,則不僅要報警,而且要給出可能漏氣的輪胎的准確位置;
- 如果存在兩個或兩個以上輪胎的壓力值與它們中的最大值誤差超過了閾值,或者低於系統設定的最低報警胎壓,則報警要求檢查所有輪胎。
輸入格式
輸入在一行中給出 6 個 [0, 400] 范圍內的整數,依次為 1~4 號輪胎的胎壓、最低報警胎壓、以及胎壓差的閾值。
輸出格式
根據輸入的胎壓值給出對應信息:
- 如果不用報警,輸出
Normal
; - 如果有一個輪胎需要報警,輸出
Warning: please check #X!
,其中X
是出問題的輪胎的編號; - 如果需要檢查所有輪胎,輸出
Warning: please check all the tires!
。
輸入樣例 1
242 251 231 248 230 20
輸出樣例 1
Normal
輸入樣例 2
242 251 232 248 230 10
輸出樣例 2
Warning: please check #3!
輸入樣例 3
240 251 232 248 240 10
輸出樣例 3
Warning: please check all the tires!
作者:陳越
單位:浙江大學
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
PZ.cpp
#include<cstdio>
#include<algorithm>
using namespace std;
int s[5],Min,P,cnt,pos,Max;
int main(){
scanf("%d %d %d %d %d %d",&s[1],&s[2],&s[3],&s[4],&Min,&P);
Max=max(s[1],max(s[2],max(s[3],s[4])));
for(int i=1;i<=4;++i)
if(Max-s[i]>P || s[i]<Min) ++cnt,pos=i;
if(cnt==0) puts("Normal");
else if(cnt==1) printf("Warning: please check #%d!",pos);
else puts("Warning: please check all the tires!");
return 0;
}
L1-070 吃火鍋 (15 分)
以上圖片來自微信朋友圈:這種天氣你有什么破事打電話給我基本沒用。但是如果你說“吃火鍋”,那就厲害了,我們的故事就開始了。
本題要求你實現一個程序,自動檢查你朋友給你發來的信息里有沒有 chi1 huo3 guo1
。
輸入格式
輸入每行給出一句不超過 80 個字符的、以回車結尾的朋友信息,信息為非空字符串,僅包括字母、數字、空格、可見的半角標點符號。當讀到某一行只有一個英文句點 .
時,輸入結束,此行不算在朋友信息里。
輸出格式
首先在一行中輸出朋友信息的總條數。然后對朋友的每一行信息,檢查其中是否包含 chi1 huo3 guo1
,並且統計這樣厲害的信息有多少條。在第二行中首先輸出第一次出現 chi1 huo3 guo1
的信息是第幾條(從 1 開始計數),然后輸出這類信息的總條數,其間以一個空格分隔。題目保證輸出的所有數字不超過 100。
如果朋友從頭到尾都沒提 chi1 huo3 guo1
這個關鍵詞,則在第二行輸出一個表情 -_-#
。
輸入樣例 1
Hello!
are you there?
wantta chi1 huo3 guo1?
that's so li hai le
our story begins from chi1 huo3 guo1 le
.
輸出樣例 1
5
3 2
輸入樣例 2
Hello!
are you there?
wantta qi huo3 guo1 chi1huo3guo1?
that's so li hai le
our story begins from ci1 huo4 guo2 le
.
輸出樣例 2
5
-_-#
作者:陳越
單位:浙江大學
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
PZ.cpp
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
string s;
int sum,pos,cnt;
int main(){
while(getline(cin,s) && s!="."){
++sum;
if(s.find("chi1 huo3 guo1")!=-1){
if(!pos) pos=sum;
++cnt;
}
}
printf("%d\n",sum);
if(cnt) printf("%d %d",pos,cnt);
else puts("-_-#");
return 0;
}
L1-071 前世檔案 (20 分)
網絡世界中時常會遇到這類滑稽的算命小程序,實現原理很簡單,隨便設計幾個問題,根據玩家對每個問題的回答選擇一條判斷樹中的路徑(如下圖所示),結論就是路徑終點對應的那個結點。
現在我們把結論從左到右順序編號,編號從 1 開始。這里假設回答都是簡單的“是”或“否”,又假設回答“是”對應向左的路徑,回答“否”對應向右的路徑。給定玩家的一系列回答,請你返回其得到的結論的編號。
輸入格式:
輸入第一行給出兩個正整數:N(≤30)為玩家做一次測試要回答的問題數量;M(≤100)為玩家人數。
隨后 M 行,每行順次給出玩家的 N 個回答。這里用 y
代表“是”,用 n
代表“否”。
輸出格式:
對每個玩家,在一行中輸出其對應的結論的編號。
輸入樣例:
3 4
yny
nyy
nyn
yyn
輸出樣例:
3
5
6
2
作者:陳越
單位:浙江大學
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
PZ's Solution
1.本題可以轉換為在一棵二叉樹上移動,輸出最底層的結點號即可;
2.可以直接套用二叉樹編號,這樣 最后一層的結點號\(-2^{n}+1\) 即為答案;
PZ.cpp
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m;
string s;
int dfs(int x,int o){
if(x==n) return o;
if(s[x]=='y') dfs(x+1,o<<1);
else dfs(x+1,o<<1|1);
}
int main(){
scanf("%d %d",&n,&m);
while(m--){
cin>>s;
printf("%d\n",dfs(0,1)-(int)pow(2,n)+1);
}
return 0;
}
L1-072 刮刮彩票 (20 分)
“刮刮彩票”是一款網絡游戲里面的一個小游戲。如圖所示:
每次游戲玩家會拿到一張彩票,上面會有 \(9\) 個數字,分別為數字 \(1\) 到數字 \(9\),數字各不重復,並以 \(3×3\) 的“九宮格”形式排布在彩票上。
在游戲開始時能看見一個位置上的數字,其他位置上的數字均不可見。你可以選擇三個位置的數字刮開,這樣玩家就能看見四個位置上的數字了。最后玩家再從 \(3\) 橫、\(3\) 豎、\(2\) 斜共 \(8\) 個方向中挑選一個方向,方向上三個數字的和可根據下列表格進行兌獎,獲得對應數額的金幣。
數字合計 | 獲得金幣 | 數字合計 | 獲得金幣 |
---|---|---|---|
6 | 10,000 | 16 | 72 |
7 | 36 | 17 | 180 |
8 | 720 | 18 | 119 |
9 | 360 | 19 | 36 |
10 | 80 | 20 | 306 |
11 | 252 | 21 | 1,080 |
12 | 108 | 22 | 144 |
13 | 72 | 23 | 1,800 |
14 | 54 | 24 | 3,600 |
15 | 180 |
現在請你寫出一個模擬程序,模擬玩家的游戲過程。
輸入格式
輸入第一部分給出一張合法的彩票,即用 3 行 3 列給出 0 至 9 的數字。0 表示的是這個位置上的數字初始時就能看見了,而不是彩票上的數字為 0。
第二部給出玩家刮開的三個位置,分為三行,每行按格式 x y
給出玩家刮開的位置的行號和列號(題目中定義左上角的位置為第 1 行、第 1 列。)。數據保證玩家不會重復刮開已刮開的數字。
最后一部分給出玩家選擇的方向,即一個整數: 1 至 3 表示選擇橫向的第一行、第二行、第三行,4 至 6 表示縱向的第一列、第二列、第三列,7、8分別表示左上到右下的主對角線和右上到左下的副對角線。
輸出格式
對於每一個刮開的操作,在一行中輸出玩家能看到的數字。最后對於選擇的方向,在一行中輸出玩家獲得的金幣數量。
輸入樣例
1 2 3
4 5 6
7 8 0
1 1
2 2
2 3
7
輸出樣例
1
5
6
180
作者:DAI, Longao
單位:杭州百騰教育科技有限公司
代碼長度限制:16 KB
時間限制:400 ms
內存限制:64 MB
PZ.cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int mp[4][4],num,ans,px,py,C[25]={0,0,0,0,0,0,10000,36,720,360,80,252,108,72,54,180,72,180,119,36,306,1080,144,1800,3600};
bool vis[10];
int main(){
for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j){
scanf("%d",&mp[i][j]);
if(mp[i][j]==0) px=i,py=j;
vis[mp[i][j]]=1;
}
for(int i=1;i<=9;++i) if(!vis[i]) mp[px][py]=i;
for(int x,y,i=1;i<=3;++i){
scanf("%d %d",&x,&y);
printf("%d\n",mp[x][y]);
}
scanf("%d",&num);
if(1<=num && num<=3) ans=mp[num][1]+mp[num][2]+mp[num][3];
if(4<=num && num<=6) ans=mp[1][num-3]+mp[2][num-3]+mp[3][num-3];
if(num==7) ans=mp[1][1]+mp[2][2]+mp[3][3];
if(num==8) ans=mp[1][3]+mp[2][2]+mp[3][1];
printf("%d",C[ans]);
return 0;
}