L1-056 猜数字 (20分)
输入格式:
输入在第一行给出一个正整数N(≤10000 )。随后 N 行
每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。
输出格式:
在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。
输入样例:
7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62
输出样例:
22 Amy
作者: 陈越
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB
题目分析:
要求找出猜到最接近平均数一半的朋友,输出平均数的一半 然后输出这个朋友的名字。
简单的模拟题,可以把每人的名字、猜的数字和与平均数的一半的差值用结构体表示出来。
再根据这个差值将结构体从小到大排序,此时排在第一位的朋友就是最接近正确答案的朋友啦。
代码如下:
#include <iostream>
#include <algorithm>
#include <cmath> //用到abs()求绝对值函数
using namespace std;
struct people
{
string name; //朋友的名字
int num; //猜的数
int s; //和目标值的差
}peo[10010];
bool rule(people a,people b) //自定义排序规则
{
return a.s< b.s;
}
int main()
{
int n,sum=0; //sum计算所有朋友猜的数的和 (sum/n)/2就是平均数的一半
cin >> n;
for(int i=0;i<n;i++) //依次输入n个朋友名字 所猜的数,sum累加
{
cin >> peo[i].name >> peo[i].num;
sum+=peo[i].num;
}
for(int i=0;i<n;i++) //为差值赋值
{
peo[i].s=abs(peo[i].num-(sum/n)/2);
}
sort(peo,peo+n,rule); //排序
cout << (sum/n)/2 << " "<<peo[0].name;
return 0;
}
加油!