【题目解析】汉中校区11/8周六晚比赛

~ 2025-11-15 11:34:52

A. 三位数重新排列

分析

  • 难度:简单数位分解,基础条件判断。
  • 子任务 1(30 分):显然直接输出 nn 即可。
  • 子任务 2(30 分):分别取出来个位、十位、百位,三个数排序后输出即可。
  • 子任务 3(40 分):子任务 2 中的有可能得到 0 或者 00 开头的数。可以用条件判断特殊处理,也可以直接把三个数字重新组成为一个数。

满分参考代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int a = n / 100;
    int b = n / 10 % 10;
    int c = n % 10;
    if (a > b)
        swap(a, b);
    if (a > c)
        swap(a, c);
    if (b > c)
        swap(b, c);
    cout << a * 100 + b * 10 + c;
    return 0;
}

B. 千钱买千鸡

  • 难度:枚举优化。
  • 子任务 1(30 分):显然不可能买前两种鸡了,暴力枚举后两种各买几只即可。
  • 子任务 2(30 分):没啥特殊作用的凑数子任务。
  • 子任务 3(40 分):其实就是个百钱买百鸡的升级版。按百钱买百鸡一样的模式,枚举前三种鸡的数量,然后算出第四种鸡的数量,计算是否满足条件即可。看上去 n3n^3可能会超时,但实际上控制好三种鸡数量之和为 1000 的话,常数是非常小的。而且也可以进一步优化,第四种鸡的数量必然是 dd 的倍数,可以考虑先枚举第四种鸡,当 dd 为 1 时也可以直接输出 0 0 0 1000

满分参考代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    int ans = 0;
    for (int i = 0; i <= 1000; i++)
        for (int j = 0; j <= 1000 - i; j++)
            for (int k = 0; k <= 1000 - i - j; k++)
            {
                int l = 1000 - i - j - k;
                if (d != 0 && l % d == 0 && i * a + j * b + k * c + l / d == 1000)
                {
                    cout << i << " " << j << " " << k << " " << l;
                    return 0;
                }
            }
    cout << "-i";
    return 0;
}

C. 前后洗牌

分析

  • 难度:简单字符串枚举
  • 子任务 1(30 分):直接输出 ss 即可。
  • 子任务 2(30 分):让 ii 枚举前半部分,依次输出 sis_i 与对称位置即可。
  • 子任务 3(40 分):做法很多。考虑在子任务 2 的基础上中间的位置只输出依次就好。可以用两个变量分别指示头部和尾部。当然也可以真的按照题目意思模拟。

满分参考代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s, t;
    cin >> s;
    t = "";
    int l = 0;
    int r = (int)s.size() - 1;
    while (l <= r)
    {
        if (l <= r)
        {
            t += s[l];
            l++;
        }
        if (l <= r)
        {
            t += s[r];
            r--;
        }
    }
    cout << t;
    return 0;
}

D. 一维分形图

分析

  • 难度:基础递归/打表。
  • 按点得分,数据范围又小。所以可以先把样例给的五个点打表,那 50 分就得到了。
  • 后面的分数可以考虑手动模拟画出来,然后打表,这题是不会超源文件长度限制的。
  • 标准做法自然是递归地去画这个分形图。

满分参考代码

#include <bits/stdc++.h>
using namespace std;

void func(int n)
{
	if(n == 0) {
		cout << "#";
	}
	else {
		func(n - 1);
		for(int i = 1; i <= pow(3, n - 1); i++) cout << ".";
		func(n - 1);
	}
}

int main(){  
	int n;
	cin >> n;
	func(n);
    return 0;
}


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