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

猜你喜欢

转载自www.cnblogs.com/miraitowa/p/10059756.html