P10139 [USACO24JAN] Nap Sort G 题解
Description
Bessie 正在尝试使用她自己的排序算法对一个整数数组进行排序。她有一堆共
Farmer John 命令了农场中其他一些奶牛帮助 Bessie 完成任务,她们很懒,然而 Bessie 利用了这一点。她将整数分成两堆:Bessie 堆和助手堆。对于 Bessie 堆中的每个整数,她会正常执行她的算法。对于助手堆中的每个整数,她将其分配给不同的助手奶牛。Farmer John 有一个很大的农场,所以 Bessie 可以找来任意多的助手奶牛。如果助手收到整数
请帮助 Bessie 划分她的数,使得最终得到的数组是排序的,并使得排序该数组所需的时间最少。
Solution
先把
先考虑对于一个
容易发现这个对于
时间复杂度:
Code
#include <bits/stdc++.h> #define int int64_t const int kMaxN = 2e5 + 5; int n; int a[kMaxN]; bool check(int k) { int now = 1, sum = k * (k + 1) / 2; for (int i = n - 1; i; --i) { if (a[i] >= sum) sum -= (now++); if (now > k) return 0; } return 1; } void dickdreamer() { std::cin >> n; for (int i = 1; i <= n; ++i) std::cin >> a[i]; std::sort(a + 1, a + 1 + n); int L = 0, R = n, res = n; while (L + 1 < R) { int mid = (L + R) >> 1; if (check(mid)) R = res = mid; else L = mid; } std::cout << std::min(res * (res + 1) / 2, a[n]) << '\n'; } int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; std::cin >> T; while (T--) dickdreamer(); // std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n"; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步