A-牛牛的签到题

格式控制符里输入%%即可输出一个%;输出\\即可输出一个\;printf("\"\"")即可输出双引号。

#include<stdio.h>
int main()
{
    printf("This is an output question. Please output it\"%%%%%%\\n\\n\\n\".");

}

B-牛牛的mex函数

可以用数组进行标记,将出现的数标记为1,最后遍历一遍即可。

#include<string.h> 
int main()
{
 
    int a[1010];
    memset(a,0,sizeof(a));//数组初始化为0 
    int n;
    scanf("%d",&n); 
    for(int i=0;i<n;i++){
        int x;
        scanf("%d",&x);
        a[x]=1;	//对数组进行标记 
    }
    
    for(int i=0;i<=100;i++)
        if(a[i]==0){
            printf("%d",i);
            break;
        }		//遍历数组,若a[i]==0说明i在集合S中没有出现过 输出后跳出。 
}

C-牛牛的战斗力

由高中的基本不等式

alt

当a=b时,取等时和最小,可用math.h里面的sqrt对n开方。

#include<stdio.h>
#include<math.h>
int main()
{
    int n;
    scanf("%d",&n);
    double cnt=sqrt(n);
    cnt*=2;
    printf("%.3lf",cnt);
}

D-牛牛的x数

处理每一位求最大值及其出现的次数即可

#include<stdio.h>
#include<math.h>
int main()
{
    int m,cnt,n;	//m代表当前最大值,cnt表示其出现的次数 
    scanf("%d",&n);
    n=abs(n),cnt=0,m=-1;
    if(n==0){
        printf("0");
        return 0;
    }	 
    while(n){
        int t=n%10;	//得到n的末位 
        n/=10;		 
        if(t==m)cnt++;
        if(t>m){
            cnt=1;
            m=t;
        }
    }
    if(cnt!=1)printf("NO");
    else printf("%d",m);
}

E-牛牛的素数判断

//这题数据弱了,有些a×b的也过了(a×b会爆掉);由于评测姬出了一些问题,时间复杂度也没卡到//

由素数定义可知若a×b为素数则必定其中一个数为1且另一个数必须为素数,因此本题只需判断不为1那个数是否为素数即可。

时间限制为1s的话,如果你在判断素数时从2挨个求余会超时,判断到sqrt(n)即可。

#include<stdio.h>
#include<math.h>
int prime(long long x){
	if(x==1)return 0;
    for(int i=2;i<=sqrt(x);i++)if(x%i==0)return 0;
    return 1;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        long long a,b;
        scanf("%lld%lld",&a,&b);
        if(a==1&&prime(b)==1||b==1&&prime(a)==1)printf("YES\n");
        else printf("NO\n");
    }
}

F-牛牛的导数

水题,没啥好说的,注意int会爆,开long long就行。

#include<stdio.h>
int main()
{
 
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    a=a*b;
    b--;
    long long cnt=1;
    int t=b;
    while(t>0)cnt*=c,t--;
    cnt*=a;
    printf("%lld",cnt);
}

G-牛牛的循环次数

//比赛时,评测姬出了一些问题,导致这题没卡到人//

这题自己跑循环,正常情况下1s肯定超时。

用排列组合的方式思考,用n=5举个例子:

有编号为1~5的5个小球,取3个小球,则有A(3,5)=60种情况,但每一组都出现了6次,如1,2,3这种组合有A(3,3)=6种情况,但只有(1,2,3)这种是满足要求的,因此可以得到公式A(3,n)/A(3,3)。

也可以跑一些数据慢慢找规律……。

#include<stdio.h>
int main()
{
    int n,T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        int cnt=0;
        cnt=n*(n-1)*(n-2)/6;
        printf("%d\n",cnt);
    }
     
}

H-牛牛的数独

这题用数组模拟判断,判断行,列,九宫格时可以开一个数组进行标记。

#include<stdio.h>
int main()
{
    int board[9][9];
    for(int i=0;i<9;i++)
        for(int j=0;j<9;j++)scanf("%d",&board[i][j]); 
        
    //检查行
    for(int i=0;i<9;i++){
        int a[10]={0};	
        for(int j=0;j<9;j++){
            if(board[i][j]==0)continue;	
            if(a[board[i][j]]!=0){printf("no");return 0;}
            a[board[i][j]]=1;
        }
    }
    //检查列
    for(int i=0;i<9;i++){
        int a[10]={0};
        for(int j=0;j<9;j++){
            if(board[j][i]==0)continue;
            if(a[board[j][i]]!=0){printf("no");return 0;}
            a[board[j][i]]=1;
        }
    }
    //检查九宫格
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++){
            int a[10]={0};
            for(int ii=i*3;ii<i*3+3;ii++)
                for(int jj=j*3;jj<j*3+3;jj++){
                    if(board[ii][jj]==0)continue;
                    if(a[board[ii][jj]]!=0){printf("no");return 0;}
                    a[board[ii][jj]]=1;
                }
        }
    printf("yes");   
}