PAT刷題之路之L1_056_猜數字

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

這道題思路上倒是不難,基本網上都是一致的循環一個一個數字來比較,比如這個

#include<iostream>
//#include<cstdio>
//#include<cmath>
//using namespace std;
//struct E{
//	char name[11];
//	int num;
//}a[10001];
//int main(){
//	int n, sum = 0;
//	scanf("%d", &n);
//	for (int i = 0; i<n; i++){
//		scanf("%s%d", a[i].name, &a[i].num);
//		sum += a[i].num;
//	}
//	int avg = (sum / n) / 2, minm = 11111, tag;
//	for (int i = 0; i<n; i++){
//		if (abs(avg - a[i].num)<minm){
//			minm = abs(avg - a[i].num);
//			tag = i;
//		}
//	}
//	printf("%d %s\n", avg, a[tag].name);
//	return 0;
//}

基本上先定義一個結構體,然後把數字和名字存進來,之後再一個一個要做差然後比較,這樣的話要循環n次(n爲總人數),我的想法就是利用map裏的自動排序功能,存入的信息就是一個有序隊列,然後求出平均值,在平均值附近尋找符合的元素,但是發現這樣時間複雜度和空間複雜度基本和上面這個差不多,不過我想,雖然利用了map的自動排序功能,然後再尋找平均值值附近值得時候省了不少時間,但是map在插入數據的時候排序還是花了不少的時間,然後這種方法也是可以通過把上面的算法變形來獲得,具體操作是先將結構體數組按照數字大小排序,然後再從平均值附近開始尋找,這樣的話,十分依賴排序算法的能力,如果採用的排序算法性能不好,當數據量比較大的時候,就比原來的方法性能差。

而我自己的方法,利用map,然後通過map的find方法來尋找合適的值,因爲map裏的排序功能採用的是二叉樹排序,性能比較好,所以最終性能和上面的差不多,具體代碼如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	map<int, string> m;
	map <int, string> ::const_iterator m_AcIter,m_BcIter;
	int num,n,average=0;
	string str;
	ifstream f("L1_056_GuessNum.txt");
	f >> num;
	for (int i = 0; i < num; i++)
	{
		f >> str >> n;
		average += n;
		m.insert(pair<int, string>(n, str));
		//m1.insert(pair<int, int>(i, n));
	}
	average /= num;
	average /= 2;
	int i = average, j= average, r,l;
	while(1)
	{
		m_AcIter=m.find(i);
		m_BcIter = m.find(j);
		if (m_AcIter != m.end() || m_BcIter != m.end())//任意一個有值
		{
			if (m_AcIter!=m.end())
			{
				cout << average << " " << m_AcIter->second;
				break;
			}
			else if (m_BcIter != m.end())
			{
				cout << average << " " << m_BcIter->second;
				break;
			}
		}
		else
		{
			i++; j--;
		}
		
		
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章