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组...)

猜你喜欢

转载自blog.csdn.net/zhangshuaiisme/article/details/80791881