PTA刷題——猜數字
阿新 • • 發佈:2018-12-03
7-46 猜數字 (20 分)
一群人坐在一起,每人猜一個 100 以內的數,誰的數字最接近大家平均數的一半就贏。本題就要求你找出其中的贏家。
輸入格式:
輸入在第一行給出一個正整數N(≤104)。隨後 N 行,每行給出一個玩家的名字(由不超過8個英文字母組成的字串)和其猜的正整數(≤ 100)。
輸出格式:
在一行中順序輸出:大家平均數的一半(只輸出整數部分)、贏家的名字,其間以空格分隔。題目保證贏家是唯一的。
輸入樣例:
7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62
輸出樣例:
22 Amy
題目分析
這一題不屬於水題,至少我是這麼看的,我的思路很簡單:
用猜數做下標,用名字做陣列中的資料,遍歷陣列,找出最接近平均值的一半的下標。輸出平均值的一半,和對應下標存的名字即可。
題目保證贏家唯一,所以,只有一個人猜到的最終結果。即使出現多個人猜一個數,對應下標存的名字會被覆蓋也沒關係,反正他們都不是最終答案
最後給出程式碼:
#include<bits/stdc++.h> using namespace std; int main() { int n,b,sum=0,x=1000,y; string name,a[105]; int c; cin>>n; for(int i=0; i<n; i++) { cin>>name>>b; a[b]=name; sum+=b; } double ave=0.5*sum/n; for(int i=0; i<=100; i++) if(a[i] !=""&&abs(ave-i)<x) { y=i; x=abs(ave-i); } c=ave; cout<<c<<" "<<a[y]; return 0; }
而網上一些人都是這樣寫的
#include<bits/stdc++.h> using namespace std; struct Person { string name; int val; } p[10001]; int n, minId;; double sum, mind = 999999999; int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { cin>>p[i].name>>p[i].val; sum += p[i].val; } double ave = sum / n / 2; for (int i = 0; i < n; i++) { if (abs(p[i].val - ave) < mind) { mind = abs(p[i].val - ave); minId = i; } } printf("%d %s\n", (int)ave, p[minId].name.c_str()); return 0; }