问题:
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组...)