上海市计算机学会月赛 2022年9月月赛丙组

发布于:2022-12-14 ⋅ 阅读:(604) ⋅ 点赞:(0)

这次题目真的衡水

文章拖了好久忘记发了
明天初赛祝各位考试顺利有一个好的心态(我也要考/(ㄒoㄒ)/~~)

矩形的周长与面积

内存限制: 256 Mb时间限制: 1000 ms
题目描述
给定一个矩形的长为 a,宽为 b,请输出这个矩形的周长和面积。

输入格式
两个整数表示 a 与 b。

输出格式
第一行:单个整数表示矩形的周长
第二行:单个整数表示矩形的面积

数据范围
1≤a,b≤10000

样例数据
输入:
3 2
输出:
10
6
输入:
12 3
输出:
30
36
分析:
不分析

#include <bits/stdc++.h>
using namespace std;
long long a, b;
int main() {
	cin >> a >> b;
	cout << 2 * (a + b) << endl << a*b;
	return 0;
}

机会成本

内存限制: 256 Mb时间限制: 1000 ms
题目描述
每个人的一生只能做好一件事。给定一个正整数 nn,表示人生中的 nn 件事。若认真对待某件事,可以获得的分数为 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1,a2,,an,若不认真对待,则获得的分数为 b 1 , b 2 , … , b n b_1,b_2,\dots,b_n b1,b2,,bn。请计算应该认真对待哪一件事,才能让分数的总和达到最大。

输入格式
第一行:单个整数表示 n
第二行到第 n+1 行:每行两个整数表示 a i a_i ai b i b_i bi

输出格式
单个整数:表示最大的分数之和

数据范围
对于 30% 的数据,1≤n≤5,000;
对于 60% 的数据,1≤n≤20,000;
对于 100% 的数据,1≤n≤500,000;
0 ≤ b i ≤ a i ≤ 4000 0\leq b_i\leq a_i\leq 4000 0biai4000
样例数据
输入:
3
1 1
2 0
3 2
输出:
5
说明:
选择做好第二件事
分析:
不要想复杂,就是所有的分数加起来再加上分差最大的一门。

#include <iostream>
using namespace std;
int a, b, n, cnt[500001], sum, maxn;
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a >> b;
		cnt[i] = a - b;
		maxn = max(maxn, cnt[i]);
		sum += b;
	}
	cout << sum + maxn << endl;
	return 0;
}

三色排序

内存限制: 256 Mb时间限制: 1000 ms
题目描述
给定 n 个整数 a 1 , a 2 , … , a n a_1,a_2,\dots, a_n a1,a2,,an ,每个数字都是 0,1,2 中的一个,请将其中的一部分数字两两交换,使得结果是升序的,请问最少需要几次交换?

输入格式
第一行:单个整数表示 n
第二行:n 个整数表示 a 1 , a 2 , … , a n a_1,a_2,\dots, a_n a1,a2,,an

输出格式
单个整数:表示最少交换次数。

数据范围
对于 30% 的数据,1≤n≤5,000;
对于 60% 的数据,1≤n≤100,000;
对于 100% 的数据,1≤n≤1,000,000;
0 ≤ a i ≤ 2 0\leq a_i\leq 2 0ai2
样例数据
输入:
5
2 0 1 2 0
输出:
1
说明:
将第一个2与最后一个0交换即可
分析:
看一下有多少个2和0的位置错了就换过来,因为1永远要是在中间的

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e6+1;
int n, c[MAXN], num[3], x1, x2, e0, e1;
int main() {
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> c[i];
		++num[c[i]];
	}
	for (int i = 1; i <= num[0]; ++i)
		if (c[i] == 1)
			x1++;
		else if (c[i] == 2)
			x2++;
	for (int i = num[0] + num[1] + 1; i <= n; ++i)
		if (c[i] == 1) 
			e1++;
		else if (c[i] == 0)	
			e0++;
	cout << x1 + x2 + e1 + e0 - min(e0, x2) << endl;
	return 0;
}

阶乘尾数

内存限制: 256 Mb时间限制: 1000 ms
题目描述
给定一个整数 n,n 的阶乘定义为

n ! = 1 × 2 × ⋯ × n n!=1\times 2\times \cdots \times n n!=1×2××n

请计算在 n! 的十进制表示中,末尾有多少个连续的 0?

例如 n=5,则 n!=120,末尾有 1 个 0,又12!=479001600,末尾有 2 个 0。

输入格式
单个整数表示 n。

输出格式
单个整数表示 n! 中末尾零的个数。

数据范围
对于 30% 的数据,1≤n≤1000;
对于 60% 的数据,1≤n≤1,000,000;
对于 100% 的数据,1≤n≤2,000,000,000;
样例数据
输入:
5
输出:
1
输入:
12
输出:
2
说明:
12的阶乘为479001600
分析:
简单数学题,看一下n的阶乘中有多少个5(在5的倍数里找)

#include <bits/stdc++.h>
using namespace std;
long long n;
long long f(long long n) {
	long long num = 0, i, j;
	for (i = 5; i <= n; i += 5) {
		j = i;
		while (j % 5 == 0) {
			++num;
			j /= 5;
		}
	}
	return num;
}
int main() {
	cin >> n;
	cout << f(n);
	return 0;
}

前序中序转后序

内存限制: 256 Mb时间限制: 1000 ms
题目描述
有一棵二叉树,结点数量不超过 26,树上的每个结点都可以用一个唯一的大写英文字母区分,给定这棵二叉树的前序遍历与中序遍历,请输出它的后序遍历。

输入格式
第一行:一个字符串,表示二叉树的前序遍历;
第二行:一个字符串,表示二叉树的中序遍历。

输出格式
单独一行:一个字符串,表示二叉树的后序遍历。

数据范围
设二叉树的结点数量为 n,

对于 50% 的数据,1≤n≤10
对于 100% 的数据,1≤n≤26
样例数据
输入:
ACE
CAE
输出:
CEA
分析:
按照前中序的原理,前序判根中序判位置。

#include <bits/stdc++.h>
using namespace std;
int cnt = 0;
string n1, n2;
void tree(int l, int r, char ch) {
	for (int i = l; i < r; ++i) {
		if (n2[i] == ch) {
			if (l < i)
				tree(l, i, n1[cnt++]);
			if (i + 1 < r)
				tree(i + 1, r, n1[cnt++]);
			cout << ch;
			break;
		}
	}
}
int main() {
	cin >> n1 >> n2;
	tree(0, n1.size(), n1[cnt++]);
	return 0;
}
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到