mirror of
https://github.com/InternLM/InternBootcamp.git
synced 2026-04-22 16:49:04 +00:00
184 lines
5.4 KiB
Python
Executable file
184 lines
5.4 KiB
Python
Executable file
"""#
|
|
|
|
### 谜题描述
|
|
Vladimir wants to modernize partitions in his office. To make the office more comfortable he decided to remove a partition and plant several bamboos in a row. He thinks it would be nice if there are n bamboos in a row, and the i-th from the left is ai meters high.
|
|
|
|
Vladimir has just planted n bamboos in a row, each of which has height 0 meters right now, but they grow 1 meter each day. In order to make the partition nice Vladimir can cut each bamboo once at any height (no greater that the height of the bamboo), and then the bamboo will stop growing.
|
|
|
|
Vladimir wants to check the bamboos each d days (i.e. d days after he planted, then after 2d days and so on), and cut the bamboos that reached the required height. Vladimir wants the total length of bamboo parts he will cut off to be no greater than k meters.
|
|
|
|
What is the maximum value d he can choose so that he can achieve what he wants without cutting off more than k meters of bamboo?
|
|
|
|
Input
|
|
|
|
The first line contains two integers n and k (1 ≤ n ≤ 100, 1 ≤ k ≤ 1011) — the number of bamboos and the maximum total length of cut parts, in meters.
|
|
|
|
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109) — the required heights of bamboos, in meters.
|
|
|
|
Output
|
|
|
|
Print a single integer — the maximum value of d such that Vladimir can reach his goal.
|
|
|
|
Examples
|
|
|
|
Input
|
|
|
|
3 4
|
|
1 3 5
|
|
|
|
|
|
Output
|
|
|
|
3
|
|
|
|
|
|
Input
|
|
|
|
3 40
|
|
10 30 50
|
|
|
|
|
|
Output
|
|
|
|
32
|
|
|
|
Note
|
|
|
|
In the first example Vladimir can check bamboos each 3 days. Then he will cut the first and the second bamboos after 3 days, and the third bamboo after 6 days. The total length of cut parts is 2 + 0 + 1 = 3 meters.
|
|
|
|
Here is a reference code to solve this task. You can use this to help you genereate cases or validate the solution.
|
|
```python
|
|
import itertools
|
|
import sys
|
|
|
|
unfold = itertools.chain
|
|
|
|
def jumps(a):
|
|
d = speedup
|
|
while d < a - 1:
|
|
c = (a + d - 1) // d
|
|
d = (a + c - 2) // (c - 1)
|
|
yield d
|
|
|
|
|
|
def calc(d):
|
|
return sum(d - 1 - (i - 1) % d for i in a)
|
|
|
|
def ans():
|
|
for d, pd in zip(D, D[1:]):
|
|
d -= 1
|
|
cd = calc(d)
|
|
if cd <= k:
|
|
return d
|
|
if d == pd:
|
|
continue
|
|
cpd = calc(pd)
|
|
if d - pd >= ((cd - k) * (d - pd) + cd - cpd - 1) / (cd - cpd):
|
|
return d - ((cd - k) * (d - pd) + cd - cpd - 1) / (cd - cpd)
|
|
return 1
|
|
|
|
t = sys.stdin.readlines()
|
|
n, k = map(int, t[0].split())
|
|
a = list(map(int, t[1].split()))
|
|
speedup = 4 * int(max(a) ** 0.5)
|
|
|
|
D = sorted(set(range(1, speedup + 1)).union([max(a) + k + 1]).union(set(
|
|
unfold(*map(jumps, a)))), reverse=True)
|
|
|
|
print int(ans())
|
|
```
|
|
|
|
|
|
请完成上述谜题的训练场环境类实现,包括所有必要的方法。
|
|
"""
|
|
|
|
from bootcamp import Basebootcamp
|
|
import random
|
|
import re
|
|
from bootcamp import Basebootcamp
|
|
|
|
class Cbamboopartitionbootcamp(Basebootcamp):
|
|
def __init__(self, **params):
|
|
self.params = {
|
|
'n_range': (1, 100),
|
|
'a_max': 10**9,
|
|
'k_max': 10**11
|
|
}
|
|
self.params.update(params)
|
|
|
|
def case_generator(self):
|
|
n = random.randint(*self.params['n_range'])
|
|
a = [random.randint(1, self.params['a_max']) for _ in range(n)]
|
|
k = random.randint(1, self.params['k_max'])
|
|
return {
|
|
'n': n,
|
|
'k': k,
|
|
'a': a
|
|
}
|
|
|
|
@staticmethod
|
|
def prompt_func(question_case):
|
|
a_list = question_case['a']
|
|
a_str = ' '.join(map(str, a_list))
|
|
prompt = f"""Vladimir wants to modernize the partitions in his office by planting bamboos. Each bamboo starts at 0 meters and grows 1 meter each day. He can check the bamboos every d days and cut each bamboo once to their required height. The total length of the cut parts must not exceed k meters. Find the maximum possible value of d.
|
|
|
|
Input:
|
|
- The first line contains two integers n and k.
|
|
- The second line contains n integers a1, a2, ..., an.
|
|
|
|
Your task is to compute the maximum possible d.
|
|
|
|
For example, given the input:
|
|
3 4
|
|
1 3 5
|
|
The correct output is 3, as cutting at days 3 and 6 gives a total cut length of 3 meters.
|
|
|
|
Provide your answer as an integer within [answer] tags, like [answer]3[/answer].
|
|
|
|
Problem instance:
|
|
n = {question_case['n']}, k = {question_case['k']}
|
|
a = {a_str}
|
|
|
|
What is the maximum possible value of d?"""
|
|
return prompt
|
|
|
|
@staticmethod
|
|
def extract_output(output):
|
|
matches = re.findall(r'\[answer\](.*?)\[/answer\]', output, re.DOTALL)
|
|
if matches:
|
|
return matches[-1].strip()
|
|
return None
|
|
|
|
@classmethod
|
|
def _verify_correction(cls, solution, identity):
|
|
try:
|
|
d = int(solution)
|
|
except (ValueError, TypeError):
|
|
return False
|
|
n = identity['n']
|
|
k = identity['k']
|
|
a = identity['a']
|
|
|
|
# Calculate total cuts for d
|
|
total = 0
|
|
for ai in a:
|
|
if d <= 0:
|
|
return False
|
|
m = (ai + d - 1) // d
|
|
cut = m * d - ai
|
|
total += cut
|
|
if total > k:
|
|
break
|
|
if total > k:
|
|
return False
|
|
|
|
# Calculate total cuts for d+1 to ensure it's the maximum possible d
|
|
total_next = 0
|
|
d_next = d + 1
|
|
for ai in a:
|
|
m = (ai + d_next - 1) // d_next
|
|
cut = m * d_next - ai
|
|
total_next += cut
|
|
if total_next > k:
|
|
break
|
|
return total_next > k
|