1. 程式人生 > >PTA刷題——猜數字

PTA刷題——猜數字

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;
}