Google Code-Jam 2008 資格賽A題
阿新 • • 發佈:2018-11-23
問題:
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
最優解證明: 用遞推的方法,很容易證明(0組,1組,2組...)
問題說明: 使用者的搜尋請求通過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 次數。 輸入的資料格式看問題連結的說明
解答思路:
python程式碼: 使用:python this_code.py > output.txt
時間複雜度分析: O(n) 只遍歷了一次query# -*- 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()
最優解證明: 用遞推的方法,很容易證明(0組,1組,2組...)