334
B-Christmas Trees
Description
有一条向东西两侧无限延伸的道路,从这条道路上的某一参考点向东
斯努克将从坐标为
高桥和青木分别站在坐标为
Constraints
- All input values are integers.
Input
Output
打印将在高桥和青木之间设置的圣诞树数量(包括他们所站的位置)。
Sample Input
5 3 -1 6
Sample Output
3
Solution
首先,让我们通过从
设
而
现在剩下的是找到站在小于或等于 x/M
。)此外,通过对浮点数进行求值以获得实数然后进行取下限可能会因为精度误差而导致错误的值,所以请小心。
Code
ans=(R - A - ((R - A) % M + M) % M) / M - (L - 1 - A - ((L - 1 - A) % M + M) % M) / M
官方题解是
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
ll floor(ll x, ll m) {
ll r = (x % m + m) % m;
return (x - r) / m;
}
int main() {
ll a, m, l, r;
cin >> a >> m >> l >> r;
l -= a, r -= a;
cout << floor(r, m) - floor(l - 1, m) << endl;
}
C-Socks 2
问题陈述
高桥有
求用剩下的袜子做成
Constraints
- All input values are integers.
Input
Output
将最小总怪异度打印为整数。
Sample Input
4 2
1 3
Sample Output
2
Notes
下面,让
颜色为
Solution
首先,最优的方案是匹配他没有丢失的袜子。
对于他没有使用过的颜色
因此,这个问题可以被看作是一个问题,要求从颜色
如果
我们通过归纳进行证明。只要证明在最优解中颜色
我们通过反证法证明上面的结论。在一个最优解中,假设颜色
当
额外信息:当
Code
需要计算前缀(pre)和后缀(suf)
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> a(k);
for (int &i: a) cin >> i;
vector<int> pre(k + 1), suf(k + 1);
for (int i = 1; i <= k; i++) {
pre[i] = pre[i - 1];
if (i % 2 == 0) pre[i] += a[i - 1] - a[i - 2];
}
for (int i = k - 1; i >= 0; i--) {
suf[i] = suf[i + 1];
if ((k - i) % 2 == 0) suf[i] += a[i + 1] - a[i];
}
int ans = 1e9;
for (int i = 0; i <= k; i += 2) {
ans = min(ans, pre[i] + suf[i]);
}
cout << ans << endl;
}