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-牛牛的战斗力
由高中的基本不等式
当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");
}