ABC 334 A 题解:
思路详解:
没什么好说的,比个大小即可。
#include <bits/stdc++.h>
using namespace std;
int main() {
int b, g;
cin >> b >> g;
cout << (b > g ? "Bat\n" : "Glove\n");
return 0;
}
ABC 334 B 题解:
思路详解:
第一步算出 的能植树的最小位置
第二步算出 的能植树的最大位置
我的代码和这个思路稍有不同(略微变形)
注意:
需要使用 long long 和 long double。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ll a, m, l, r;
cin >> a >> m >> l >> r;
// a + m * x1 >= l
// a + m * x2 <= r
/*
m * x1 >= l - a
x1 >= (l - a) / m
x2 <= (r - a) / m
*/
long long x1 = ceil(1.0l * (l - a) / m);
long long x2 = floor(1.0l * (r - a) / m);
cout << x2 - x1 + 1 << "\n";
return 0;
}
ABC 334 C 题解:
思路详解:
考虑 ,设
表示只考虑前 i 只袜子且是否已经丢掉了袜子了(j = 1 表示丢掉了)。
转移方程见下:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
long long a[N], f[N][2];
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int n, k;
cin >> n >> k;
for (int i = 1; i <= k; i++) {
cin >> a[i];
}
for (int i = 2; i <= k; i++) {
f[i][0] = f[i - 2][0] + a[i] - a[i - 1];
f[i][1] = min(f[i - 1][0], f[i - 2][1] + a[i] - a[i - 1]);
}
cout << f[k][k % 2] << "\n";
return 0;
}
ABC 334 D 题解:
思路详解:
考虑排序后做一遍前缀和,然后直接二分即可。
本题比较简单,就不多说了(感觉除 A 外最简单题)
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
long long r[N], sum[N];
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> r[i];
}
sort(r + 1, r + n + 1);
for (int i = 1; i <= n; i++) {
sum[i] = sum[i - 1] + r[i];
}
while (q--) {
long long v;
cin >> v;
int pos = upper_bound(sum + 1, sum + n + 1, v) - sum - 1;
cout << pos << "\n";
}
return 0;
}
如果大家认为哪个地方有什么不妥之处请指出,谢谢帮助!