上海2022年12月赛丙组解题报告

上海2022年12月赛丙组解题报告

--------------cadifobp0802

T1 多边形的内角和

题目描述

一个 n 条边的多边形,其内角和公式为 180×(n−2)。给定 n,请计算并输出 n 边形的内角和。

输入格式

单个整数:表示 n。

输出格式

单个整数:表示 n 边形的内角和。

数据范围

1003≤n≤100

样例数据

输入:
3
输出:
180
输入:
5
输出:
540

我的想法

直接带入。
代码如下:

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

int n;

int main(){
	cin >> n;
	cout << 180 * (n - 2) << endl;
	return 0;
}

T2 星号三角阵(二)

题目描述

给定一个整数 n,输出一个 n 行 n 列的星号三角阵,直角位于图形的左上角。例如当 n=4 时,输出


****
***
**
*

输入格式

单个整数表示 n。

输出格式

共 n 行:表示一个星号三角阵。

数据范围

1≤n≤100

样例数据

输入:
3
输出:
***
**
*

我的想法

简单的两层循环。
代码如下:

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

int n;

int main(){
	cin >> n;
	for (int i = n; i >= 1; --i) {
		for (int j = 1; j <= i; ++j)
			cout << "*";
		cout << endl;
	}
	return 0;
}

T3 折纸

题目描述

小爱手中有一张矩形纸张,他想把这张纸分成若干正方形纸片,具体分法如下:

第1步:小爱会先确定纸张的长宽,假设短边长度为n,长边长度为m。
第2步:小爱会将短边沿直角平分线对折后剪去,从而得到一个n×n的方形纸片。
第3步:若还有剩余,小爱会将剩余的长宽为n∗(m−n)的纸张作为现有纸张,代入第一步后重复之前过程,直至没有之后纸张剩余为止。
请问按如上操作,小爱最终会得到几张方形纸片?

例如:一开始,小爱有一张 10×6 的纸张,按他的分割方法,最终他可以获得 4 张方形纸片,具体过程如下图所示:
在这里插入图片描述

输入格式

输入共两个正整数,表示初始矩形纸张的长宽 n,m

输出格式

输出题目所求能获得的矩形个数

数据范围

对于 30% 的数据,1≤n,m≤100
对于 60% 的数据,1≤n,m≤107
对于 100% 的数据,1≤n,m≤1013

样例数据

输入:
10 6
输出:
4

我的想法

可以先算出来长边中包含几个短边的长,累加后把它删去,这样循环下去。如果删完后恰好没有了,就结束。
代码如下:

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

ll m, n, ans = 0;

int main() {
	cin >> m >> n;
	while (1) {
		if (m % n == 0) {
			ans += m / n;
			break;
		}//如果m是n倍数,截取后就不剩材料了,直接结束
		else {
			ans += m / n;
			m %= n;
			swap(m, n);
		}//如果m不是n倍数,截取后仍有剩余,且此时m<n,为了方便循环须交换m与n
	}
	cout << ans << endl;
	return 0;
}

T4 中位数(二)

题目描述
中位数,就指将所有数字排序后,位置在最中间的数。
给定 n 个数字的序列 a1,a2,…,an,以及一个期望中位数 x。小爱想知道,最少再添加多少个数字,才能使序列中包含奇数个数字,且 x 为该序列的中位数?

输入格式

输入共三行:
第一行,一个正整数 n ,表示元素个数
第二行,n 个整数,分别表示 a1,a2,…,an
第三行,一个整数 x ,表示期望中位数

输出格式

输入一个整数,表示答案

数据范围

对于 30% 的数据, 1≤n≤100
对于 60% 的数据, 1≤n≤104
对于 100% 的数据,1≤n≤105 , −109 ≤ x,ai ≤109

样例数据

输入:
4
6 4 7 1
3
输出:
3
说明:
加1个3 和 2个1,就可以让3成为中位数
输入:
5
1 2 3 4 5
3
输出:
0
说明:
不用添加任何数字,3已经是中位数

我的想法

这道题首先我们要先试图在这串数字中找到设定的中位数,如果找到取最靠近中间的一个,并以此为中心,把剩下的数分成两个部分;如果没能找到这个数字,则找到这个数字添加到左边比它小、右边比它大的位置,再以此为中心分成左右两部分;
答案加上左右两部分的差的绝对值。
代码如下:

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

int n, x, a[MAXN];

int main(){
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
	}
	cin >> x;
	sort(a + 1, a + n + 1);
	int l = -1, r = n, ans = 0;
	for (int i = 1; i <= n; ++i) {
		if (x == a[i]) {
			if (abs(n + 1 - 2 * i) < abs(l - r)){
				l = i - 1;
				r = n - i;
			}
		}//能找到该数就找到最中间位置
		if (x < a[i] && l == -1) {
			l = i - 1;
			r = n - i + 1;
			ans = 1;
		}//不能找到就添加该数
	}
	ans += abs(l - r);//ans加上左右两边数字个数的差的绝对值
	cout << ans << endl;
	return 0;
}

T5 等差数列

题目描述

等差数列 指从第二项起,每一项与它的前一项的差等于同一个常数的一种数列,且这个常数叫做等差数列的公差。

例如:数列 1 5 9 13 就是一个公差为 4 的等差数列。

现给定一个长度为 n 的序列 a1,a2,…,an,请问该序列中,有多少个长度不小于 3 的子段满足等差数列?

输入格式

输入共两行:
第一行,一个正整数 n,表示给定序列长度
第二行,n 个整数,分别表示序列的每一项 a1,a2,…,an

输出格式

输出一个整数,表示满足条件的子段个数。

数据范围

对于 30% 的数据, 1≤n≤100
对于 60% 的数据, 1≤n≤104
对于 100% 的数据,1≤n≤105 , −109 ≤ x,ai ≤109

样例数据

输入:
10
-1 1 3 3 3 2 3 2 1 0
输出:
5
说明:
区间[1,3],[3,5],[7,10],[7,9],[8,10]均满足等差数列要求

我的想法

我们把每一位数跟前一位数的差给算出来,并把连续的相等的差给找出来,算出这一段中长度大于等于3的子串的个数并累加到答案上。
代码如下:

#include <bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define ll long long

ll n, a[MAXN], q[MAXN], ans = 0;

int main(){
	cin >> n;
	for (ll i = 1; i <= n; ++i) {
		cin >> a[i];
	}
	for  (ll i = 2; i <= n; ++i)
		q[i - 1] = a[i] - a[i - 1];
	q[n] = q[n - 1] + 1;//算差,最后一位加一个不可能有影响的数以方便判断
    ll t = 2;
    for (ll i = 1; i < n; ++i) {
    	if (q[i] == q[i + 1]) {
    		t++;
		}//查找子序列
		else {
			if (t >= 3) {
				t -= 2;
				ans += (1 + t) * t / 2;
			}//计算子段数量
			t = 2;
		}
	}
	cout << ans << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值