上海市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;
}