1. 程式人生 > >Google Code-Jam 2008 資格賽A題

Google Code-Jam 2008 資格賽A題

問題: https://code.google.com/codejam/contest/32013/dashboard
問題說明:  使用者的搜尋請求通過central system彙集,然後按照先到先處理的順序傳送到search   engine 進行解決。  這裡有幾個要求:  1)central system 將會一直向當前search engine傳送搜尋請求,  2)search engine解決的問題不能是自己的engine name,如果是,就進行任務switch  ,將使用者請求發到其他的search engine,這個稱為switch,   3)search engine數量大於等於2(一定可以進行switch,解決衝突)  4)所有的query都是search engine的name  問題:由於switch會影響效能,給出switch最少意味著最優。請給出最優情況下的switch  次數。  輸入的資料格式看問題連結的說明
解答思路:
 每次碰到所有search engine一次後(稱為一組),才進行切換  這樣能夠保證每一組都是這一次search engine選擇中,最長的那個   貪心演算法
python程式碼: 使用:python this_code.py > output.txt
# -*- coding: UTF-8 -*-
#第一行為了支援中文

# 處理一個case的函式
def solve_one_case( fo ):
	count=0
	i=0
	#跳過search engine資訊
	search_engine_num=int(fo.readline())
	while(i<search_engine_num):
		fo.readline()
		i=i+1
	
	#讀取query資訊,並直接處理
	#query只能是search engine的name
	query_num=int(fo.readline())
	query_dict={}
	i=0
	while(i<query_num):
		query=str(fo.readline())
		query=query.strip('\n')		#消除 \n
		#詞典中查詢query
		if(query_dict.get(query,0)==0):
			#query不存在,統計dict數量數量(不能超過search engine數)
			if(len(query_dict) == search_engine_num-1):
				count = count+1
				query_dict.clear()
			#插入
			query_dict[query]=1
		i=i+1
		
	return count

#主函式
def solve_all_cases():
	fo=open("A-small-practice.in","r")
	case_num=int(fo.readline())
	case_result_list = []
	i=0;
	while(i<case_num):
		case_result_list.append(solve_one_case(fo))
		i=i+1
	fo.close()
	
	i=0
	while(i < len(case_result_list)):
		print("Case #"+str(i+1)+": "+str(case_result_list[i]))
		i=i+1

	return 

#開始執行
solve_all_cases()
時間複雜度分析:  O(n)  只遍歷了一次query
最優解證明:  用遞推的方法,很容易證明(0組,1組,2組...)