PTA L1-056 猜数字 (20分)

题目描述:

群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。

输入格式:

输入在第一行给出一个正整数N(≤10^{4})。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。

输出格式:

在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。

输入样例:

7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62

输出样例:

22 Amy

解题报告:

1:数字的范围在1到100, 可以采用数组法查找。

2:算出平均数的一半之后,然后往这个数的左边和右边查找。查找到结构体中的字符串不为空就退出。

3:可能会有疑问,如果有两个人猜的数一样。根据题意,结果唯一,这个一定不会是正确答案。

4:然后比较距离即可。

代码:

#include<bits/stdc++.h>
#define N 100+10
int dic[N];
struct people{
    char name[10];
}names[N];
int main(){
    int n, x;
    char ss[10];
    double sum = 0, avg;
    scanf("%d", &n);
    for(int i=0; i<n; ++i)
        scanf("%s%d", ss, &x), strcpy(names[x].name, ss), sum += x;
    avg = sum/n/2;
    int i, j;
    for(i=avg; ;--i)
        if(strcmp("", names[i].name) != 0)break;
    for(j=avg+1; ;++j)
        if(strcmp("", names[j].name) != 0)break;
    printf("%d ", (int)avg);
    if(fabs(avg-i) < fabs(avg-j))
        printf("%s\n", names[i].name);
    else
        printf("%s\n", names[j].name);
    return 0;
}
发布了143 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/jun_____/article/details/104062314
今日推荐