第一场周赛题解(c++)

admin 发布于 2025-10-20 915 字 181 次阅读


本场c++与c的核心代码基本一致,仅输入输出不同,但后续c++更为方便;

可以学习一下c++,利于以后学习,当然c的输入输出在c++里也完全可以使用;

代码仅供参考;

有不懂的地方可以问学长()

A.简单的签到题

bits/stdc++.h为万能头文件,几乎包含所有头文件

#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"美人不我期,Cia木日零llo~(∠·ω< )⌒★。";
	return 0;
}

B.简单的打印

循环暴力即可,endl为换行;

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

C.数组

逆向循环即可

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

D.数学

1到n每个数都判断一遍是否为3的倍数即可;

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,ans;
    cin>>n;
    for(int i=1;i<=n;i++){
        if(i%3==0) ans++;
    }
    cout<<ans;
    return 0;
}

E.小曾学长的数学

sqrt(x)是x的开根号函数;

按题目给的公式计算即可;

fixed配合setprecision(x)可输出x位小数;

#include<bits/stdc++.h>
using namespace std;
int main(){
    double x1,x2,x3,y1,y2,y3,ans;
    cin>>x1>>y1>>x2>>y2>>x3>>y3;
    double a1=fabs(x1-x2),a2=fabs(y1-y2),b1=fabs(x1-x3),b2=fabs(y1-y3),c1=fabs(x2-x3),c3=fabs(y2-y3);
    double a=sqrt(a1*a1+a2*a2),b=sqrt(b1*b1+b2*b2),c=sqrt(c1*c1+c3*c3),p;
    p=(a+b+c)/2;
    ans=sqrt(p*(p-a)*(p-b)*(p-c));
    cout<<fixed<<setprecision(3)<<ans;
    return 0;
}

F.排序

介绍一下时间复杂度,本题中n<=1000,一个从1到n的循环最多1000次;

一般当计算次数大于10的9次方时会超时;

所以我们可以使用n*n的时间复杂度方法即O(N*N);

这里介绍一个简单排序算法:冒泡排序;

#include<bits/stdc++.h>
using namespace std;
int main(){
        int n;
        cin>>n;
        if(n<=0) cout<<"-1";
        else{
    	    long long a[n+1];
            for(int i=1;i<=n;i++) cin>>a[i];
    	    for(int i=1;i<=n;i++){
    		for(int j=i;j>=2;j--){
    		    if(a[j]<a[j-1]) swap(a[j],a[j-1]);//swap为交换函数
    		    else break;//将当前的数向前移直到前面的数都比它小
		}
	    }
	    for(int i=1;i<=n;i++) cout<<a[i]<<" ";
	}
	return 0;
}

G.找不同

遍历数组,不断更新最大值;

再次遍历,如果当前值不等于最大值并且是第一次出现则答案+1;

#include<bits/stdc++.h>
using namespace std;
int a[1005],b[1005];
int main(){
    int n,maxn=0,ans=0;;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) maxn=max(a[i],maxn);//max(a,b)的值为a,b中最大值;
    for(int i=1;i<=n;i++){
    	if(a[i]<maxn){
    	    if(b[a[i]]==0){
    	    	ans++;
    	    	b[a[i]]++;
	    }
	}	
    }
    cout<<ans;
    return 0;
}

H.数字分解

当一个数字可以被分解为2^x*3^y时,说明该数的质因子只包含2和3;

当该数字将自身包含的2和3除完后不是1则它还有其他质因子;

#include<bits/stdc++.h>
using namespace std;
int main(){
	long long n;
	cin>>n;
	while(n%2==0) n/=2;
	while(n%3==0) n/=3;
	if(n==1) cout<<"Yes";
	else cout<<"No";
	return 0;
}
最后更新于 2025-10-21