上海网站12月题解

第一题 多边形的内角和

题目描述

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

输入格式

单个整数:表示 n n n

输出格式

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

数据范围

3 ≤ n ≤ 100 3\leq n\leq 100 3n100

样例数据

输入:

3

输出:

180

输入:

5

输出:

540

分析:

本题就很无脑,记下数然后按他说的来做就行了

代码:

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

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

第二题 星号三角阵(二)

题目描述

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

输入格式

单个整数表示 n n n

输出格式

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

数据范围

1 ≤ n ≤ 100 1\leq n\leq 100 1n100

样例数据

输入:

3

输出:

***
**
*

分析:

本题也是一样,两层for循环就行了

代码:

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

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

第三题 折纸

题目描述

小爱手中有一张矩形纸张,他想把这张纸分成若干正方形纸片,具体分法如下:
第11步:小爱会先确定纸张的长宽,假设短边长度为nn,长边长度为 m m m
第22步:小爱会将短边沿直角平分线对折后剪去,从而得到一个 n × n n \times n n×n的方形纸片。
第33步:若还有剩余,小爱会将剩余的长宽为 n ∗ ( m − n ) n*(m-n) n(mn)的纸张作为现有纸张,代入第一步后重复之前过程,直至没有之后纸张剩余为止。
请问按如上操作,小爱最终会得到几张方形纸片?
例如:一开始,小爱有一张 10 × 6 10 \times 6 10×6的纸张,按他的分割方法,最终他可以获得 4 张方形纸片,具体过程如下图所示:

Alt

输入格式

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

输出格式

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

数据范围

对于 30 % 30 \% 30% 的数据, 1 ≤ n , m ≤ 100 1 \leq n ,m \leq 100 1n,m100
对于 60 % 60 \% 60% 的数据, 1 ≤ n , m ≤ 1 0 7 1 \leq n ,m \leq 10^7 1n,m107
对于 100 % 100 \% 100% 的数据, 1 ≤ n , m ≤ 1 0 13 1 \leq n ,m \leq 10^{13} 1n,m1013

样例数据

输入:

10 6

输出:

4

分析:本题如果照题目来的话,能拿六十分。

代码:

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

int main(){
	long long n,m,ans=1;
	cin>>n>>m;
	while(n!=m){
		if(n>m){
			n-=m;
			ans++;
		}else if(n<m){
			m-=n;
			ans++;
		}
	}
	cout<< ans << endl;
	return 0;
}
后来,这题我实在不会,先鸽一下,等后面整明白了再贴

第四题 中位数(二)

题目描述

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

输入格式

输入共三行:
第一行,一个正整数 n n n ,表示元素个数
第二行, n n n 个整数,分别表示 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an
第三行,一个整数 x x x ,表示期望中位数

输出格式

输入一个整数,表示答案

数据范围

对于 30 % 30\% 30% 的数据, 1 ≤ n ≤ 100 1 \leq n \leq 100 1n100
对于 60 % 60\% 60% 的数据, 1 ≤ n ≤ 1 0 4 1 \leq n \leq 10^4 1n104
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105, − 1 0 9 ≤ x , a i ≤ 1 0 9 −10^9≤x,a_i ≤10^9 109x,ai109

样例数据

输入:

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;
const long long MAXN=1e5+10;

long long a[MAXN],n,x;

int main(){
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>a[i];
	}
	cin>>x;
	bool f=true;
	for(int i=1;i<=n;++i){
		if(a[i]==x){
			f=false;
		}
	}
	long long ans=0,x1=0,y1=0,id=0;
	if(f==true){
		a[++n]=x;
		ans++;
	}
	sort(a+1,a+n+1);
	if(n%2==1){
		if(a[n/2+1]!=x){
			for(int i=1;i<=n;++i){
				if(a[i]==x){
					id=i;
					break;
				}
			}
			x1=id-1;
			y1=n-id;
			ans+=abs(x1-y1);
		}
	}else{
		for(int i=1;i<=n;++i){
			if(a[i]==x){
				id=i;
				break;
			}
		}
		x1=id-1;
		y1=n-id;
		ans+=abs(x1-y1);
	}
	cout<< ans << endl;
	return 0;
}

第五题 等差数列

题目描述

等差数列 指从第二项起,每一项与它的前一项的差等于同一个常数的一种数列,且这个常数叫做等差数列的公差。
例如:数列 1 5 9 13 就是一个公差为 4 的等差数列。
现给定一个长度为 n n n 的序列 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an ,请问该序列中,有多少个长度不小于 3 的子段满足等差数列?

输入格式

输入共两行:

第一行,一个正整数 n n n,表示给定序列长度
第二行, n n n 个整数,分别表示序列的每一项 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an

输出格式

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

数据范围

对于 30 % 30\% 30%的数据, 1 ≤ n ≤ 100 1 \leq n \leq 100 1n100
对于 60 % 60\% 60% 的数据, 1 ≤ n ≤ 1 0 4 1 \leq n \leq 10^4 1n104
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105 , − 1 0 9 ≤ a i ≤ 1 0 9 -10^9 \leq a_i \leq 10^9 109ai109

样例数据

输入:

10
-1 1 3 3 3 2 3 2 1 0

输出:

5

说明:

区间[1,3],[3,5],[7,10],[7,9],[8,10]均满足等差数列要求

分析:这题我没有好思路,就是硬推出来的30分

代码:

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

long long a[100010],n,cnt=0;

int main(){
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>a[i];
	}
	long long ans=0;
	for(int i=3;i<=n;++i){
		for(int j=1;j<=n-i+1;++j){
			ans=abs(a[j]-a[j+1]);
			bool f=true;
			for(int x=1;x<i;++x){
				if(abs(a[j+x-1]-a[j+x])!=ans){
					f=false;
				}
				if(a[j]-a[j+1]>=0&&a[j+x-1]-a[j+x]<0||a[j]-a[j+1]<0&&a[j+x-1]-a[j+x]>=0){
					f=false;
				}
			}
			if(f==true){
				cnt++;
			}
		}
	}
	cout<< cnt << endl;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lyoi20210204

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值