一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。
输入格式:
输入在第一行给出一个正整数N(≤104)。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。
输出格式:
在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。
输入样例:
7 Bob 35 Amy 28 James 98 Alice 11 Jack 45 Smith 33 Chris 62
输出样例:
22 Amy
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
运行代码:
方法一:使用数组
#include<iostream> using namespace std; int main() { int n; cin>>n; int sum = 0; string name[10000]; int num[10000]; for (int i=0; i<n; i++) { cin>>name[i]; cin>>num[i]; sum += num[i]; } int winner_num = 0; //标记赢家为第几个 float f = sum/n/2.0; //f为平均数一半 int D_Value = abs(f - num[0]); for (int i = 1; i<n; i++) { if (D_Value > abs(f - num[i])) { D_Value = abs(f - num[i]); winner_num = i; } } cout<<(int)f<<" "<<name[winner_num]; return 0; }
方法二:使用向量
#include <iostream> #include <vector> #include <string> using namespace std; int main() { int N; cin >> N; vector<pair<string, int>> players(N); int sum = 0; for (int i = 0; i < N; ++i) { cin >> players[i].first >> players[i].second; sum += players[i].second; } int avg_half = sum / (2 * N); string winner; int min_diff = 101; for (const auto& player : players) { int diff = abs(player.second - avg_half); if (diff < min_diff) { min_diff = diff; winner = player.first; } } cout << avg_half << " " << winner << endl; return 0; }
运行结果: