vector<ll> pre(n + 1); for (int i = 1; i <= n; ++i) { pre[i] = pre[i - 1] + read(); }
int ans = inf; for (int l = 1, r = 1; l <= n; l++) { while (r < n && pre[r] - pre[l - 1] < s) { // 当前不满足 r++; } if (pre[r] - pre[l - 1] >= s) { ans = min(ans, r - l + 1); } } printf("%d\n", ans == inf ? -1 : ans); }
vector<int> a(n); for (int i = 0; i < n; i++) { a[i] = read(); } sort(a.begin(), a.end());
ll res = 0; for (int l = 0, r1 = 1, r2 = 1; l < n; l++) { while (r2 < n && a[l] + c >= a[r2]) { r2++; } while (r1 < n && a[l] + c > a[r1]) { r1++; } res += r2 - r1; } printf("%lld\n", res); }
连续自然数和
给定正整数n,求出所有的连续的正整数段,这些连续的自然数段中的全部数之和为n。
Input
Output
10000
18 142 297 328 388 412 1998 2002
1 2 3 4 5 6 7 8 9 10 11 12
voideachT(){ int n = read();
for (int l = 0, r = 0; l < n; l++) { while ((r - l + 1ll) * (l + r) / 2 < n) { r++; } if ((r - l + 1ll) * (l + r) / 2 == n) { printf("%d %d\n", l, r); } } }
int L = 1e9, R = -1e9; // 能吃到的左右界 int p1 = n; // 第一个非负数的位置 int p2 = -1; // 最后一个非正数的位置
vector<int> a(n); for (int i = 0; i < n; i++) { a[i] = read(); if (a[i] >= 0) p1 = min(p1, i); // 第一个非负数的位置 if (a[i] <= 0) p2 = i; // 最后一个非正数的位置 if (a[i] < 0 && a[i] + i >= 0 || a[i] == 0 || a[i] > 0 && a[i] <= n - 1 - i) { L = min(L, i); R = i; // 能吃到的左右界 } }
int ans = 0; for (int l = L, r = p1; l <= R; l++) { while (r <= R && a[r] - a[l] <= l) { r++; } ans = max(ans, r - l); } for (int l = p2, r = R; r >= L; r--) { while (l >= L && a[r] - a[l] <= n - 1 - r) { l--; } ans = max(ans, r - l); } printf("%d\n", ans); }
vector<ll> a(n), d(m), f(k); for (auto& i : a) cin >> i; for (auto& i : d) cin >> i; for (auto& i : f) cin >> i; sort(d.begin(), d.end(), greater<>()); sort(f.begin(), f.end());
ll max1 = 0, max2 = 0, imax = 0; for (int i = 1; i < n; i++) { int now = a[i] - a[i - 1]; if (now >= max1) { max2 = max1; max1 = now; imax = i; } elseif (now >= max2) { max2 = now; } }
ll lo = a[imax - 1], hi = a[imax]; ll need = lo + hi; for (int i = 0, p = 0; i < m; i++) { while (p + 1 < k && abs(2 * (f[p + 1] + d[i]) - need) <= abs(2 * (f[p] + d[i]) - need)) { p++; } int now = f[p] + d[i]; if (lo < now && now < hi) { max1 = min(max1, max(hi - now, now - lo)); } } cout << max(max1, max2) << "\n";