上海市12月月赛丙组解题报告

文章提供了五道编程题目的解题思路和C++代码实现,包括多边形内角和的计算、星号三角阵的打印、折纸问题的求解、中位数的寻找以及等差数列的处理。
摘要由CSDN通过智能技术生成

上海市12月月赛丙组解题报告

T1 多边形的内角和

在这里插入图片描述

解题思路

将n代入原公式直接算出内角和

代码实现

#include <bits/stdc++.h>
using namespace std;
int n;
int main(){
	cin>>n;
	cout<<180*(n-2)<<endl;
	return 0;
}

T2 星号三角阵(二)

在这里插入图片描述

解题思路

两层循环输出每层的星号

代码实现

#include <bits/stdc++.h>
using namespace std;
int n;
int main(){
	cin>>n;
	int p=n;
	for(int i=1;i<=n;i++){
		for(int i=1;i<=p;i++){
			cout<<"*";
		}
		p--;
		cout<<endl;
	}
	return 0;
}

T3 折纸

在这里插入图片描述

解题思路

循环,当m为n的倍数时则说明全部折完没有剩余,当m不为n的倍数时则把m%n.

(我实在不知道这道题到底错在哪了,终评超时了结果再交一遍又对了)

代码实现

#include <bits/stdc++.h>
using namespace std;
long long n,m,sum=0;
int main(){
	cin>>n>>m;
	long long p1=n,p2=m;
	while((p1!=0)&&(p2!=0)){
		if(p1<p2){
			swap(p1,p2);
		}
		if(p1%p2==0){
			sum+=p1/p2; 
			p2=0;
		}
		else{
			sum+=p1/p2;
			p1=p1%p2;
		}
		//cout<<p1<<" "<<p2<<endl;
	}
	cout<<sum<<endl;
	return 0;
} 

T4 中位数(二)

在这里插入图片描述

解题思路

先遍历数组中是否有含有期望数,若没有则将期望数插入,将数组排序,找出最靠近中间的期望数a[p],ans就是a[p]左右两边个数的差

代码实现

#include <bits/stdc++.h>
using namespace std;
int a[100010],n,x,p=0,ans=0;
bool f=false;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	cin>>x;
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		if(a[i]==x){
			f=true;
		}
	}
	if(!f){
		a[n+1]=x;
		n++;
		sort(a+1,a+n+1);
		ans++;
	}//插入x
	//cout<<"ans:"<<ans<<endl;
	//cout<<"n:"<<n<<endl; 
	for(int i=1;i<=n;i++){
		if(a[i]==x){
			int mid=n/2+1;
			if(abs(i-mid)<abs(p-mid)){
				p=i;
			}
		}
		//cout<<a[i]<<" ";
	}//cout<<endl;
	//cout<<p<<" "<<a[p]<<endl;
	
	if(p==n/2+1&&n%2==1){
		ans=0;
	}
	else{
		ans+=max((n-p),(p-1))-min((n-p),(p-1));
	}//ans就是a[p]左右两边个数的差
	cout<<ans<<endl;
	return 0;
}

T5 等差数列

在这里插入图片描述

问题分析

建立一个新数组记录每项数之间的差值,再记录满足条件的子段个数

代码实现

#include <bits/stdc++.h>
using namespace std;
long long  n,a[100010],b[100010],ans=0;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<n;i++){
		b[i]=a[i+1]-a[i];
	}
	//for(int i=1;i<n;i++){
	//	cout<<b[i]<<" ";
	//}
	//cout<<endl;
	long long k=1;
	for(int i=1;i<n;i++){
		if(b[i]!=b[i+1]){
			for(int j=1;j<=i-k;j++){
				ans+=j;
			}
			k=i+1;
		}
	}
	cout<<ans<<endl;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值