voidsolve(){ cin >> n >> c; last = -c; // 记录上次拿糖的时间,初始值设一个比较小的数即可 for (int i = 1; i <= n; i++) { cin >> t; // 读入当前时间 if (t - last >= c) // 间隔时间超过 c,就可以拿糖 res++, last = t; } cout << res << endl; }
// a 起点,b 障碍,c 终点 intmove(int a, int b, int c){ if (a < b && b < c) return a + n - c; if (a < c && c < b) return c - a; if (b < c && c < a) return a - c; if (b < a && a < c) return c - a; if (c < a && a < b) return a - c; if (c < b && b < a) return c + n - a; return0; }
voidsolve(){ cin >> n >> Q; L = 1, R = 2; while (Q--) { cin >> op >> t; if (*op == 'L') res += move(L, R, t), L = t; if (*op == 'R') res += move(R, L, t), R = t; }
constint N = 2e5 + 10; int n; int A[N], B[N], c[N];
// 检查 x 能否让 B 满足条件 // true 表示满足条件,x 偏大,要向左边走 // false 表示不满足条件,x 太小,要向右边走 boolcheck(int x){ for (int i = 1; i < n; i++) c[i] = B[i]; c[n] = x; sort(c + 1, c + n + 1); for (int i = 1; i <= n; i++) // 但凡出现了 false,说明插入的 x 太小了 if (A[i] > c[i]) returnfalse; returntrue; }
voidsolve(){ // 读入数据 cin >> n; for (int i = 1; i <= n; i++) cin >> A[i]; // 读入玩具的大小 for (int i = 1; i <= n - 1; i++) cin >> B[i]; // 读入盒子的大小 // 对 A 升序排序 sort(A + 1, A + n + 1);
int l = 1, r = A[n] + 1, ans = -1; while (l < r) { int mid = (r + l) / 2; if (check(mid)) r = mid, ans = mid; else l = mid + 1; }
voidsolve(){ int n, m; cin >> n >> m; vector<vector<int>> g(n + 10); // 声明图。+10 是为了留余量 for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; g[a].push_back(b); // 添加边 }
while (heap.size()) { auto t = heap.top(); heap.pop(); int ver = t.second, d = t.first; if (st[ver]) continue; st[ver] = true; for (int i = h[ver]; i != -1; i = ne[i]) { int next = e[i]; if (dist[next] > d + 1) { dist[next] = d + 1; heap.push({dist[next], next}); } } } } } G1, G2; // 声明了两个图
voidsolve(){ // 读入数据 cin >> n >> m; // 建图 for (int i = 1; i <= m; i++) { int a, b; cin >> a >> b; G1.add(a, b); // 建正向图 G2.add(b, a); // 建反向图 }
G1.dijkstra(); G2.dijkstra(); ans = n + 1;
for (int i = 2; i <= n; i++) ans = min(ans, G1.dist[i] + G2.dist[i]); if (ans > n) cout << -1 << endl; else cout << ans << endl; }
constint MAXN = 2e5 + 10; int T, K, N; PII A[MAXN]; priority_queue<int> Q; // 大根堆 LL ans, sum;
voidsolve(){ cin >> T; while (T--) { cin >> N >> K; for (int i = 1; i <= N; i++) cin >> A[i].first; for (int i = 1; i <= N; i++) cin >> A[i].second; // 排序 sort(A + 1, A + N + 1); // 初始化 ans = 1e18, sum = 0; // 清空堆 (注:priority_queue没有clear函数) while (!Q.empty()) Q.pop();
// 处理前 K-1 个数 for (int i = 1; i < K; i++) { Q.push(A[i].second); sum += (LL)A[i].second; }
// 从第 K 个数开始 for (int i = K; i <= N; i++) { sum += (LL)A[i].second; ans = min(ans, (LL)A[i].first * sum); Q.push(A[i].second); // 把看过的 B 的最大值弹出来去掉,就能保证 sum 的值是最小的 sum -= (LL)Q.top(); Q.pop(); }