课程目录展开/折叠
2024.12.15-Contest#37-每周六模拟比赛题目讲解
播放快捷键
播放/暂停:空格(或鼠标单击) 全屏:F(或鼠标双击) 退出全屏:Esc
快进10 / 30 / 60秒:方向键→ / Ctrl + 方向键→ / Shift + 方向键→
快退10 / 30 / 60秒:方向键← / Ctrl + 方向键← / Shift + 方向键←
本节课讲解配套PPT&板书:









































比赛题目参考源代码
源代码下载:2024.12.15-Contest#37参考源代码下载
1. C1145-前缀和的逆-1
#include <bits/stdc++.h>
using namespace std;
int n;
int b[10005];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++)
cin >> b[i];
for (int i = 1; i <= n; i ++)
cout << b[i] - b[i - 1] << ' ';
return 0;
}
2. C1146-A-B 数对-1
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
int a[MAXN];
int main()
{
int n, c;
cin >> n >> c;
for (int i = 0; i < n; i ++)
cin >> a[i];
long long ans = 0;
for (int i = 0; i < n - 1; i ++)
{
for (int j = i + 1; j < n; j ++)
{
if (abs(a[i] - a[j]) == c) ans ++;
}
}
cout << ans;
return 0;
}
3. C1146-A-B 数对-2
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
int a[MAXN];
unordered_map<int, int> mp;
int main()
{
int n, c;
cin >> n >> c;
for (int i = 0; i < n; i ++)
{
cin >> a[i];
mp[a[i]] ++;
}
long long ans = 0;
for (int i = 0; i < n; i ++)
{
ans += mp[a[i] - c];
}
cout << ans;
return 0;
}
4. C1146-A-B 数对-3
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
int a[MAXN];
int main()
{
int n, c;
cin >> n >> c;
for (int i = 0; i < n; i ++)
cin >> a[i];
sort(a, a + n);
long long ans = 0;
for (int i = 0; i < n; i ++)
{
int l = lower_bound(a, a + n, a[i] + c) - a;
int r = upper_bound(a, a + n, a[i] + c) - a;
ans += r - l;
}
cout << ans;
return 0;
}
5. C1147-方阵排序-1
#include <bits/stdc++.h>
using namespace std;
struct Node {
int n;
int m;
int data[105][105];
int h; // 平均身高
int seq;
};
Node fz[105];
bool cmp(Node &n1, Node &n2)
{
return n1.h < n2.h || (n1.h == n2.h && n1.seq < n2.seq);
}
int main()
{
int k;
cin >> k;
for (int i = 0; i < k; i ++)
{
cin >> fz[i].n >> fz[i].m;
int tot = 0;
for (int r = 0; r < fz[i].n; r ++)
{
for (int c = 0; c < fz[i].m; c ++)
{
cin >> fz[i].data[r][c];
tot += fz[i].data[r][c];
}
}
fz[i].h = int(tot * 1.0 / (fz[i].n * fz[i].m) * 100 + 0.5);
fz[i].seq = i;
}
sort(fz, fz + k, cmp);
for (int i = 0; i < k; i ++)
{
cout << fz[i].n << ' ' << fz[i].m << endl;
for (int r = 0; r < fz[i].n; r ++)
{
for (int c = 0; c < fz[i].m; c ++)
{
cout << fz[i].data[r][c] << ' ';
}
cout << endl;
}
}
return 0;
}
6. C1147-方阵排序-2
#include <bits/stdc++.h>
using namespace std;
struct Node {
int n;
int m;
int data[105][105];
int h; // 平均身高
};
Node fz[105];
bool cmp(const Node &n1, const Node &n2)
{
return n1.h < n2.h;
}
int main()
{
int k;
cin >> k;
for (int i = 0; i < k; i ++)
{
cin >> fz[i].n >> fz[i].m;
int tot = 0;
for (int r = 0; r < fz[i].n; r ++)
{
for (int c = 0; c < fz[i].m; c ++)
{
cin >> fz[i].data[r][c];
tot += fz[i].data[r][c];
}
}
fz[i].h = int(tot * 1.0 / (fz[i].n * fz[i].m) * 100 + 0.5);
}
stable_sort(fz, fz + k, cmp);
for (int i = 0; i < k; i ++)
{
cout << fz[i].n << ' ' << fz[i].m << endl;
for (int r = 0; r < fz[i].n; r ++)
{
for (int c = 0; c < fz[i].m; c ++)
{
cout << fz[i].data[r][c] << ' ';
}
cout << endl;
}
}
return 0;
}
7. C1147-方阵排序-3
#include <bits/stdc++.h>
using namespace std;
struct Node {
int n;
int m;
int data[105][105];
int h; // 平均身高
};
Node fz[105];
int k;
void bubble_sort() // 冒泡排序,稳定的排序,小数冒泡的写法
{
for (int i = 0; i < k - 1; i ++)
{
bool flag = false;
for (int j = k - 1; j > i; j --)
{
if (fz[j].h < fz[j - 1].h)
{
swap(fz[j], fz[j - 1]);
flag = true;
}
}
if (!flag) return;
}
}
int main()
{
cin >> k;
for (int i = 0; i < k; i ++)
{
cin >> fz[i].n >> fz[i].m;
int tot = 0;
for (int r = 0; r < fz[i].n; r ++)
{
for (int c = 0; c < fz[i].m; c ++)
{
cin >> fz[i].data[r][c];
tot += fz[i].data[r][c];
}
}
fz[i].h = int(tot * 1.0 / (fz[i].n * fz[i].m) * 100 + 0.5);
}
// stable_sort(fz, fz + k, cmp);
bubble_sort();
for (int i = 0; i < k; i ++)
{
cout << fz[i].n << ' ' << fz[i].m << endl;
for (int r = 0; r < fz[i].n; r ++)
{
for (int c = 0; c < fz[i].m; c ++)
{
cout << fz[i].data[r][c] << ' ';
}
cout << endl;
}
}
return 0;
}
8. C1147-方阵排序-4
#include <bits/stdc++.h>
using namespace std;
int fz[10005][105];
int line;
int n[105], m[105];
// double h[105]; // 每个方阵的平均高度
int h[105]; // 每个方阵的平均高度
int *p[105];
int k;
void bubble_sort() // 冒泡排序,稳定的排序,小数冒泡的写法
{
for (int i = 0; i < k - 1; i ++)
{
bool flag = false;
for (int j = k - 1; j > i; j --)
{
if (h[j] < h[j - 1])
{
swap(h[j], h[j - 1]);
swap(p[j], p[j - 1]);
swap(n[j], n[j - 1]);
swap(m[j], m[j - 1]);
flag = true;
}
}
if (!flag) return;
}
}
int main()
{
cin >> k;
for (int i = 0; i < k; i ++)
{
cin >> n[i] >> m[i];
p[i] = &fz[line][0];
int tot = 0;
for (int r = 0; r < n[i]; r ++)
{
for (int c = 0; c < m[i]; c ++)
{
cin >> fz[line][c];
tot += fz[line][c];
}
line ++;
}
h[i] = int(tot * 1.0 / (n[i] * m[i]) * 100 + 0.5);
// cout << h[i] << endl;
}
bubble_sort();
// 输出方阵信息
for (int i = 0; i < k; i ++)
{
int *ps = p[i];
cout << n[i] << ' ' << m[i] << endl;
for (int r = 0; r < n[i]; r ++)
{
for (int c = 0; c < m[i]; c ++)
{
// cout << *(p[i] + r * m[i] + c) << ' '; // 这样不行,因为会访问的是当前行后面为0的列
cout << *(ps + c) << ' ';
}
ps += 105; // 二维数组的列数
cout << endl;
}
}
return 0;
}
9. C1148-最长公共子序列-1
#include <bits/stdc++.h>
using namespace std;
int dp[5005][5005];
int main()
{
const char endl = '\n';
ios::sync_with_stdio(false);
cin.tie(0);
string x, y;
while (cin >> x >> y)
{
int n = x.size();
int m = y.size();
for (int i = 1; i <= n; i ++)
{
for (int j = 1; j <= m; j ++)
{
if (x[i - 1] == y[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
}
}
cout << dp[n][m] << endl;
}
return 0;
}
10. C1148-最长公共子序列-2
#include <bits/stdc++.h>
using namespace std;
int dp[5005][5005];
char x[5005], y[5005];
int main()
{
const char endl = '\n';
ios::sync_with_stdio(false);
cin.tie(0);
while (cin >> x >> y)
{
int n = strlen(x);
int m = strlen(y);
for (int i = 1; i <= n; i ++)
{
for (int j = 1; j <= m; j ++)
{
if (x[i - 1] == y[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
}
}
cout << dp[n][m] << endl;
}
return 0;
}
本节课答疑
建议大家有问题先通过AI答疑(比如:DeepSeek 等),AI时代需要学会使用AI辅助学习
陈远龙老师视频讲解:如何使用DeepSeek进行答疑?
通过AI未能获得满意解答的,可以联系陈远龙老师答疑
目录