Hackerearth.com编程问题解题思路系列:Roy's Chocolates

问题描述:

设从1至n编号的n人围成一圈,给出序号M[i]的m人是被标记的,从序号为b的人开始,每过s人答一声“到”。要求找出这样的b和s,使得被标记的m人全部都答过一声“到”,而没有被标记过的人不答“到”。n在10^9量级,m在10^6量级。

问题分析:

最原始的方法是枚举s和b,时间复杂度为O(n^2*m),由于n,m的量级比较大,所以不能直接硬举,要先寻找一些规律,再配合搜索进行求解。

首先将M[i]在坐标轴上画下来:将1到n向右在坐标轴上扩展,令M1,M2...Mm分别为第1,2...,m个答到的人,按每隔s的顺序在坐标轴上标出,如下图:


注:图中相邻两个M之间距离为s

经观察得出:


将上面所有式相加,并在两边各加上M1,得到:


式中m与各个Mi之和是已知的,M1即是出发点b,是枚举的对象,还差一个s没有确定,如果枚举s,可以先确定出s的范围。

这时将公式改写成如下形式:


而t是可以确定的:


[x]为取整函数(不超过x的最大整数)

于是可得:


整理得:


这时s的范围可以定得比较小,枚举s基本上花费常数时间,算法整体的时间复杂度是O(n)

Python代码:

n,m=[int(i) for i in raw_input().split()]
M=[int(i) for i in raw_input().split()]
def calc():
	global n,m
	global M
	if m==1:
		print "%d %d"%(M[0],n)
		return
	sumM=sum(M)
	for i in range(m):
		left=int((sumM-m*M[i]-n)*2/(m-2)/(m-1))
		if left<=0:
			left=1
		right=int((sumM-m*M[i])*2/(m-2)/(m-1))+1
			#print left,right
		for l in range(left,right+1):
			if int((m*M[i]+m*(m-1)*l/2))%n==sumM%n and (M[i]+l) in M and (M[i]+2*l) in M:
				print "%d %d"%(M[i],l)
				return
	print "impossible"
calc()


原题:https://www.hackerearth.com/problem/approximate/roys-chocolates/

Roy has brought one chocolate for each of his m friends to class today. After knowing that, all of his n classmates demanded chocolates from him. But Roy wanted to give chocolates only to his friends.

So, he told them to stand in a circle around him, where the 1st student stands next to the nth one. Then Roy will follow a strategy to distribute the chocolates. He will start by giving chocolate to some person b, and will continue to give chocolate to every sth person. After someone receives chocolate, s/he does not leave the circle.

Roy noticed the positions of his friends, and now he wants to choose b and s in such a way that, only and all of his friends get those chocolates.

Input Format

The first line of input contains 2 space separated integers, n and m, number of Roy's classmates and number of Roy's friends. The next line contains m space separated integers, the positions of Roy's friends.

Output Format

Output suitable b and s to execute Roy's plan. If no suitable answer exists, output "impossible" ( without the quotes ).
If there are multiple solutions, print any of them.

Constraints

1 ≤ n ≤ 10 
1 ≤ m ≤ 10 
m ≤ n 

positions of Roy's friends will be given in increasing order.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值