1996(962div3)
A. Legs
农夫约翰来到农场后,数了数
假设约翰农场主数清了所有动物的腿,那么他的农场里最少有多少动物?
void solve() {
int n;cin >> n;
cout << (n + 3) / 4 << '\n';
}
B. Scale
分割网格
void solve() {
int n, k;cin >> n >> k;
vector<string> a(n + 1);
for (int i = 1;i <= n;i++) {
string s;cin >> s;s = " " + s;a[i] = s;
}
for (int i = 1;i <= n;i += k) {
for (int j = 1;j <= n;j += k) {
cout << a[i][j];
}
cout << '\n';
}
}
C. Sort
给你两个长度为
对于每个查询,你都会得到一个以
对于任意字符串
这个题也是锻炼了一下像本题类型的前缀和。
void solve() {
int n, q;cin >> n >> q;
string a, b;cin >> a >> b;a = ' ' + a;b = ' ' + b;
vector<array<int, 26>> prea(n + 1), preb(n + 1);
for (int i = 1;i <= n;i++) {
for (int j = 0;j < 26;j++) {
prea[i][j] = prea[i - 1][j];
preb[i][j] = preb[i - 1][j];
}
prea[i][a[i] - 'a']++;
preb[i][b[i] - 'a']++;
}
while (q--) {
int l, r;cin >> l >> r;
int ans = 0;
vector<int> ala(26), alb(26);
for (int i = 0;i < 26;i++)ala[i] = prea[r][i] - prea[l - 1][i];
for (int i = 0;i < 26;i++)alb[i] = preb[r][i] - preb[l - 1][i];
for (int i = 0;i < 26;i++) {
ans += abs(ala[i] - alb[i]);
}
cout << ans / 2 << '\n';
}
}
D. Fun
给定两个整数
即有顺序要求且
Solution
这个题很简单,是自己想复杂了,总觉得复杂度不对 hh。
知道了
for i i <= n i++
for j i * j <= n j++
运算次数为:
原式可化为:
其中
则原式
void solve() {
int n, x;cin >> n >> x;
int sum = 0;
for (int a = 1;a <= min(x - 2, n);a++) {
for (int b = 1;a * b < n && a + b < x;b++) {
sum += min((n - a * b) / (a + b), x - a - b);
}
}
cout << sum << "\n";
}
E. Decode
为了获得你的 "女神 "最喜欢的角色,你不顾一切地侵入了游戏的源代码。经过数天的努力,你终于找到了编码游戏中 gacha 系统的二进制字符串。为了解码它,您必须首先解决以下问题。
给你一个长度为
输出所有可能的
Solution
遇到这种要让之相等的题目,和牛客周赛52-F 有点像。
若
即本问题变为:对于所有区间
若对于某个区间
即左边
区间都可以选择,右边 区间都可以选择
即:
for (int l = 1;l <= n;l++) {
for (int r = l;r <= n;r++) {
if (pre[r] == pre[l - 1]) {
ans += l * (n - r + 1);ans %= mod;
}
}
}
运用 DP 的思想,通过枚举
#define int long long
constexpr int mod = 1e9 + 7;
void solve() {
string s;cin >> s;int n = s.size();
vector<int> pre(n + 1);
for (int i = 0;i < n;i++) {
pre[i + 1] = pre[i] + (s[i] == '0' ? -1 : 1);
}
vector<int> f(2 * n + 1);
int ans = 0;
for (int i = 0;i <= n;i++) {
int t = pre[i] + n;
ans += f[t] * (n - i + 1);ans %= mod;
f[t] += i + 1;f[t] %= mod;
}
cout << ans << '\n';
}
F. Bomb
Sparkle 给你两个长度为
在火花引爆核弹之前,您只有时间进行
Solution
1995(961div2) 之后补