语法周赛 Round 27 题解
2024年12月25日大约 3 分钟
A. 33DAI 的数字游戏
分析
- 难度:CSP-J 2019 第一题的数字游戏升级版。处理的时候大家不用想复杂了,毕竟才第一题嘛。
满分参考代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
freopen("number.in", "r", stdin);
freopen("number.out", "w", stdout);
char a;
int cnt = 0;
cin >> a; if (a == '3') cnt++; // 1
cin >> a; if (a == '3') cnt++; // 2
cin >> a; if (a == '3') cnt++; // 3
cin >> a; if (a == '3') cnt++; // 4
cin >> a; if (a == '3') cnt++; // 5
cin >> a; if (a == '3') cnt++; // 6
cin >> a; if (a == '3') cnt++; // 7
cin >> a; if (a == '3') cnt++; // 8
cout << cnt;
return 0;
}
B. 第三大的数
分析
- 子任务 1(30 分):保证了三个数,三数排序后输出第三个数即可。
- 子任务 2(30 分):所有数都相等,输出
即可。 - 子任务 3(40 分):语法周赛第二题是不能考数组的,所以这里给的也是不用数组记录的方式。显然我们只需要记录前三名的数。按大小规则替换即可。
满分参考代码
#include <bits/stdc++.h>
using namespace std;
int n, x;
int a, b, c;
int main()
{
freopen("thrid.in", "r", stdin);
freopen("thrid.out", "w", stdout);
a = b = c = -1'000'000'000 - 1;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> x;
if (x >= a)
{
c = b;
b = a;
a = x;
}
else if (x >= b)
{
c = b;
b = x;
}
else if (x >= c)
{
c = x;
}
}
cout << c;
return 0;
}
C. 曼哈顿圆圈
分析
- 难度:如题所述,算出
、算出中心点 ,然后枚举 每个位置,符合条件的输出*
,不符合条件的输出.
即可。
满分参考代码
#include <bits/stdc++.h>
using namespace std;
int n, k, x;
int main()
{
freopen("circle.in", "r", stdin);
freopen("circle.out", "w", stdout);
cin >> n;
k = (n - 1) / 2;
x = (n + 1) / 2;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (abs(i - x) + abs(j - x) == k)
cout << "*";
else
cout << ".";
}
cout << "\n";
}
return 0;
}
D. 朋友平均有几个朋友
分析
题面中提到的视频是:https://www.bilibili.com/video/BV1PE421w7jL/
- 子任务 1(30 分):每个人都有
个朋友,按格式直接输出即可。 - 子任务 2(30 分):整个朋友关系形成了一条链,
有一个朋友,其他人都有两个朋友。 - 子任务 3(40 分):有同学觉得这是图论,但实际上我们只需要记住朋友有谁,每个人几个朋友。就可以算出每个人朋友的朋友总数,和平均朋友数量了。这里我没有用
vector
存图,数据范围很小,我就用最简单的方式存下每条边,判断每个人朋友数量,完全不超纲。
满分参考代码
#include <bits/stdc++.h>
using namespace std;
int n, m;
pair<int, int> e[1000 * 999 / 2 + 5];
int cnt[1005], sum[1005];
int main()
{
freopen("friend.in", "r", stdin);
freopen("friend.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= m; i++)
cin >> e[i].first >> e[i].second;
for (int i = 1; i <= m; i++)
{
cnt[e[i].first]++;
cnt[e[i].second]++;
}
for (int i = 1; i <= m; i++)
{
sum[e[i].first] += cnt[e[i].second];
sum[e[i].second] += cnt[e[i].first];
}
for (int i = 1; i <= n; i++)
cout << cnt[i] << " " << (sum[i] + (cnt[i] - 1)) / cnt[i] << "\n";
return 0;
}