【发布时间】:2019-06-06 05:32:53
【问题描述】:
来自 CCC 2019 的问题 4
问题描述 您正计划参观 N 个旅游景点。景点从1到N编号, 必须按此顺序访问。一天最多可以逛K个景点,想规划行程 尽量减少天数。 在这些限制条件下,您希望找到一个在景点之间具有良好平衡的时间表 每天参观。准确地说,我们分配一个分数 ai 吸引我。给定一个时间表,每一天都是 给定的分数等于当天访问的所有景点的最高分。最后,分数 将每一天相加得出时间表的总分。最大可能的总数是多少 使用尽可能少的天数? 输入规范 第一行包含两个空格分隔的整数 N 和 K (1 ≤ K ≤ N ≤ 10^6 )。 下一行包含 N 个空格分隔的整数 ai (1 ≤ ai ≤ 10^9 )。 对于 15 个可用标记中的 3 个,2K ≥ N。 对于 15 个可用标记中的另外 3 个,K ≤ 100 和 N ≤ 10^5 . 输出规格 输出单个整数,即可能的最大总分。 样本输入 5 3 2 5 7 1 4 样本输入的输出 12 样本输入的输出说明 我们需要至少两天的时间来参观所有景点,因为我们无法参观所有景点 一天。 第一天参观前两个景点得5分,参观后三个景点得5分 第 2 天将给出 7 分,总分 12 分。 第一天参观三个景点,第二天参观两个景点,这是唯一的可能 在尽可能少的天数内访问,总分为 7 + 4 = 11。
我的方法 使用递归遍历最初的景点,然后在第二天发送部分,并在每个递归中找到最高分
def scores(things, att, days):
minper = attractions(att,row1[1])
if att <= 0:
return 0, False
if days > minday:
return 0, True
else:
maxscore = 0
for y in range(minper,row1[1]+1):
score, more = scores(things[y:],att-y,days+ 1)
if not(more):
score += max(things[:y+1])
if score >= maxscore:
maxscore = score
return maxscore, False
def attractions(attr,maxper):
if (attr % maxper) == 0 and attr > 0:
return maxper
return (attr % maxper)
row1=(input()).split(" ")
places=(input()).split(" ")
for x in range(len(row1)):
row1[x] = int(row1[x])
for x in range(len(places)):
places[x] = int(places[x])
if (row1[0]/row1[1])%1 == 0:
minday = int(row1[0]/row1[1])
else:
minday =(row1[0]//row1[1]) + 1
if minday !=1:
maxscore = 0
for x in range(attractions(row1[0],row1[1]),row1[1]+1):
score, more = scores(places[x:],row1[0]-x,1)
if not(more):
score += max(places[:x])
if score >= maxscore:
maxscore = score
print(maxscore)
else:
print(max(places))
问题的测试用例包括 N 为 1000000 且 K 为 999999 的数字,这意味着这 2 天(最少天数)每天可能的行程为 1,999999 2,999998 ... 999998,2 999999 ,1,这个方法耗时太长,还有另一种情况,比如N=51,K=10,所以可以是10,10,10,10,10,1或者10,1,10,10, 10,10 或者它也可以是 9,9,9,9,9,6 和更多,但它涵盖了加起来最少天数的所有数字排列。如何更好地优化这一点,或者有更好的方法在 1 秒内完成。
【问题讨论】:
-
由于这是一个竞赛问题,所以我不会发布答案,但会给出提示:如果我们将函数
S(i, a)定义为您在使用i天后可以达到的最高总分a的景点,您如何以动态编程方式使用以前的值计算该值?
标签: python algorithm optimization