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;
}
原文地址:https://www.cnblogs.com/miraitowa/p/10059756.html
时间: 2024-10-03 05:40:32