Farmer John's cows are excited to learn that Chinese New Year was recently celebrated, ushering in the year of the Ox, always a bovine favorite.
As we know, the zodiac animals for Chinese calendar years follow a 12-year cycle: Ox, Tiger, Rabbit, Dragon, Snake, Horse, Goat, Monkey, Rooster, Dog, Pig, Rat, and then Ox again. Slightly lesser known is the fact that a mysterious time portal opens up during every year of the Ox, allowing cows to travel through time to any other year of the Ox in the past or future.
Bessie the cow would like to take advantage of the time portal that has opened up this year to visit NN of her famous bovine ancestors who lived long ago in history, with 1≤N≤0x100001≤N≤0x10000 (it seems fitting, being the year of the Ox, to write the bound on NN in hexadecimal; note that 0x10000 is the same as 65536).
Unfortunately, time travel makes Bessie a bit queasy, and she would prefer to make at most KK jumps through time (1≤K≤N1≤K≤N). Please help Bessie determine the minimum number of years it will take her to visit all her ancestors and return to the present year, with at most KK total jumps through time along the way.
Bessie does not need to use the time portal in a given Ox year if she does not want to. Time portals connect the first days of each Ox year with each-other, so for example if Bessie travels to a time portal and then waits 12 years for the next time portal, she spends exactly 12 years in the process. Bessie starts her adventure on the first day of the present Ox year, so she can travel back in time right away. None of Bessie's ancestors live in Ox years.
The first line of input contains NN and KK. The next NN lines contain NN distinct integers in the range 1…1091…109, indicating how many years ago each of Bessie's NN ancestors lived.
Print the minimum number of years it will take Bessie to visit all her ancestors and return to the present year.
5 3 101 85 100 46 95
36
One way for Bessie to visit all her ancestors and return in 36 years is as follows:
Problem credits: Brian Dean and David Yang
[/hide]
(Analysis by Spencer Compton)
We start by thinking about the structure of Bessie's journey through time. Since there are only time portals on years that are multiples of 12, and none of Bessie's relatives are born in such a year, to visit some relative Bessie must also visit the preceding year of the Ox and wait 12 years. For example, if Bessie has a relative from 15 years ago, Bessie must visit the year of the Ox 24 years ago and must wait until at least the year of the Ox 12 years ago. In other words, we can think of each year xx as belonging to a 12-year cycle ⌊x+1112⌋⌊x+1112⌋, so 00 belongs to cycle 00, [1,…,12][1,…,12] to cycle 11, [13,…,24][13,…,24] to cycle 22, and so on. Meaning, if Bessie has a relative in cycle xx then Bessie must spend all 12 years in that cycle.
We must use a jump to go back to the earliest cycle, then with the remaining K−1K−1 jumps Bessie can skip over contiguous ranges of unnecessary cycles. It is then optimal to skip over the K−1K−1 largest contiguous ranges of unused cycles. One way we can accomplish this is by identifying all the cycles Bessie has relatives in, sorting them, identifying the gaps between adjacent cycles in the sorted list, and sorting those gaps to find the K−1K−1 largest. In total, this takes O(nlog(n))O(nlog(n)) time.
Brian Dean's code:
#include <iostream> #include <set> #include <vector> #include <algorithm> using namespace std; set<int> blocks; vector<int> gaps; int main(void) { int N, K, years_ago, answer, last = 0; cin >> N >> K; for (int i=0; i<N; i++) { cin >> years_ago; blocks.insert ((years_ago+11)/12); } answer = *blocks.rbegin(); while (!blocks.empty()) { gaps.push_back(*blocks.begin() - last - 1); last = *blocks.begin(); blocks.erase(*blocks.begin()); } sort (gaps.rbegin(), gaps.rend()); for (int i=0; i<K-1 && i<gaps.size(); i++) answer -= gaps[i]; cout << answer * 12 << "\n"; }
[/hide]
© 2024. All Rights Reserved. 沪ICP备2023009024号-1