四大文化赛道完整展开
06-deliverables/appendix-code.md
丝路互市排期:开放区间合并与峰值日统计 代码附录
站内文件视图直接读取仓库内容,Markdown 使用文档排版渲染,其余文本文件保持原始排版,方便校对训练证据链。
文件类型Markdown
10-cases/s3-jh-06-market-calendar/06-deliverables/appendix-code.md
- 完整解题档案:complete-solution-dossier.md
Python 主实现
源文件:main.py
- 实现状态:当前已有可执行实现
import sys
def solve(data: str) -> str:
tokens = list(map(int, data.split()))
if not tokens:
return ""
it = iter(tokens)
n = next(it)
days_total = next(it)
diff = [0] * (days_total + 3)
for _ in range(n):
left = next(it)
right = next(it)
diff[left] += 1
diff[right + 1] -= 1
active = 0
max_open = -1
first_peak = 0
merged = []
start = None
for day in range(1, days_total + 1):
active += diff[day]
if active > max_open:
max_open = active
first_peak = day
if active > 0 and start is None:
start = day
if active == 0 and start is not None:
merged.append((start, day - 1))
start = None
if start is not None:
merged.append((start, days_total))
merged_text = "|".join(f"{left}-{right}" for left, right in merged) if merged else "NONE"
return "\n".join(
[
f"max_open={max_open}",
f"first_peak_day={first_peak}",
f"merged={merged_text}",
]
)
if __name__ == "__main__":
sys.stdout.write(solve(sys.stdin.read()).strip())
sys.stdout.write("\n")
C++ 对照实现
源文件:main.cpp
- 实现状态:当前已有可执行实现
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, days_total;
if (!(cin >> n >> days_total)) {
return 0;
}
vector<int> diff(days_total + 3, 0);
for (int i = 0; i < n; ++i) {
int left, right;
cin >> left >> right;
++diff[left];
--diff[right + 1];
}
int active = 0;
int max_open = -1;
int first_peak = 0;
vector<pair<int, int>> merged;
int start = -1;
for (int day = 1; day <= days_total; ++day) {
active += diff[day];
if (active > max_open) {
max_open = active;
first_peak = day;
}
if (active > 0 && start == -1) {
start = day;
}
if (active == 0 && start != -1) {
merged.push_back({start, day - 1});
start = -1;
}
}
if (start != -1) {
merged.push_back({start, days_total});
}
cout << "max_open=" << max_open << "\n";
cout << "first_peak_day=" << first_peak << "\n";
cout << "merged=";
if (merged.empty()) {
cout << "NONE";
} else {
for (size_t i = 0; i < merged.size(); ++i) {
if (i) {
cout << '|';
}
cout << merged[i].first << '-' << merged[i].second;
}
}
cout << "\n";
return 0;
}