5/23【汉中校区周六晚比赛题解】

~ 2026-5-30 9:04:05

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 分):所有数都相等,输出 a1a_1 即可。
  • 子任务 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. 曼哈顿圆圈

分析

  • 难度:如题所述,算出 kk、算出中心点 (x,x)(x,x),然后枚举 n×nn\times n 每个位置,符合条件的输出 *,不符合条件的输出 . 即可。

满分参考代码

#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 分):每个人都有 n1n-1 个朋友,按格式直接输出即可。
  • 子任务 2(30 分):整个朋友关系形成了一条链,1,n1,n 有一个朋友,其他人都有两个朋友。
  • 子任务 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;
}


我们会审查剪贴板内容,并对发布不合适内容的同学进行相应的处理