补♂课第10场

Overview

凑十个题

main()函数不写 return 默认返回 0。下同。

#include<stdio.h>
int main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d",a+b);
}

求一元二次方程的根

养成好习惯,浮点数进行比较的时候作差取绝对值。

#include<stdio.h>
#include<math.h>
int main()
{
	int n;
	scanf("%d",&n);
	for(double a,b,c,d,r,i; n--;)
	{
		scanf("%lf%lf%lf",&a,&b,&c);
		d=b*b-4*a*c;
		if(fabs(d)<1e-9)
			printf("x1=x2=%.5f\n",
				   -b/a/2);
		else if(d>0)
			printf("x1=%.5f;x2=%.5f\n",
				   (-b+sqrt(d))/2/a,
				   (-b-sqrt(d))/2/a);
		else
		{
			r=(0-b)/2/a;//直接写-b会导致实部打印负零
			i=sqrt(-d)/2/a;
			printf("x1=%.5f+%.5fi;x2=%.5f-%.5fi\n",
				   r,i,r,i);
		}
	}
}

平衡饮食

通过预处理降低代码量。

#include<stdio.h>
double cont[10][3]=
{
	7.5,0.75,78,
	10,1.25,75,
	1.5,0.19,4.28,
	35,18,42,
	500,500,60,//一百颗蛋
	16.5,28.8,1.05,
	17.7,20.33,4.06,
	14.9,0.8,0.93,
	0,100,0,
	0.85,0.5,8
},all,sum[3]= {0,0,0},scal[3]= {4.1,9.3,4.1};
int main()
{
	for(int i=0,tmp; i!=10; ++i)
	{
		scanf("%d",&tmp);
		for(int j=0; j!=3; ++j)
			sum[j]+=tmp*scal[j]*cont[i][j];
	}
	all=sum[0]+sum[1]+sum[2];
	for(int i=0; i!=3; ++i)
		sum[i]/=all;
	printf(sum[0]>0.14&&sum[0]<0.16&&
		   sum[1]>0.3&&sum[1]<0.35&&
		   sum[2]>0.49&&sum[2]<0.56?
		   "yes":"no");
}

求出 e 的值

#include<stdio.h>
int main()
{
	int n;
	double s=1,w=1;
	scanf("%d",&n);
	for(int i=1; i<=n; ++i)
		s+=1/(w*=i);
	printf("%.10lf",s);
}

数制转换

偷个懒,直接用 stdlib.h 库里的 strtol 函数。 n 为 0 的情况不要漏掉了。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	long a,b,n=0;
	char s[32];
	scanf("%d%s%d",&a,s,&b);
	n=strtol(s,NULL,a);
	if(n==0)
	{
		printf("0");
		return 0;
	}
	for(a=0; n; n/=b)
		s[a++]=(n%b>9?n%b+'A'-10:n%b+'0');
	while(a)
		printf("%c",s[--a]);
}

合唱队形

为了方便,给每名队员重新编号,新编号从 0 开始。 记 f[0][i] 为第 i 名队员左边最多可站的人数,那么有这样的转移关系: f[0][i]=max{0,f[0][j]+1} ,其中 j 是满足 0<=j<i&&t[i]>t[j] 的所有数;同理,记 f[1][i] 为第 i 名队员右边最多可站的人数,那么有这样的转移关系: f[1][i]=max{0,f[1][j]+1} ,其中 j 是满足 i<j<n&&t[i]>t[j] 的所有数;其中,式中的 1 是第 j 名同学自身。 于是,结果是 n-max{f[0][i]+f[1][i]}-1 ,式中 1 是第 i 名队员本身。

#include<stdio.h>
int n,tmp=0,t[128]= {0},f[2][128]= {0};
//全局数组声明的时候如果没有给初值则初始化为0
int main()
{
	scanf("%d",&n);
	for(int i=0; i!=n; ++i)
	{
		scanf("%d",&t[i]);
		for(int j=0; j!=i; ++j)
			if(t[i]>t[j]&&f[0][i]<f[0][j]+1)
				f[0][i]=f[0][j]+1;
	}
	for(int i=n-1; i!=-1; --i)
	{
		for(int j=i; j!=n; ++j)
			if(t[i]>t[j]&&f[1][i]<f[1][j]+1)
				f[1][i]=f[1][j]+1;
		if(tmp<f[0][i]+f[1][i])
			tmp=f[0][i]+f[1][i];
	}
	printf("%d",n-tmp-1);
}

细菌繁殖

直接按日模拟。

#include<stdio.h>
long n,days[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
	scanf("%d",&n);
	for(long m1,m2,d1,d2,z; n--;)
	{
		scanf("%d%d%d%d%d",&m1,&d1,&z,&m2,&d2);
		for(; m1!=m2||d1!=d2; ++d1,z*=2)
			if(d1==days[m1])
			{
				++m1;
				d1=0;
			}
		printf("%d\n",z);
	}
}

肿瘤面积

#include<stdio.h>
int main()
{
	int n,x[2]= {0,1024},y[2]= {0,1024};
	scanf("%d",&n);
	for(int i=0,tmp; i!=n; ++i)
		for(int j=0; j!=n; ++j)
		{
			scanf("%d",&tmp);
			if(!tmp)
			{
				if(x[0]<i)x[0]=i;
				if(x[1]>i)x[1]=i;
				if(y[0]<j)y[0]=j;
				if(y[1]>j)y[1]=j;
			}
		}
	printf("%d",(x[0]-x[1]-1)*(y[0]-y[1]-1));
}

求平均年龄

#include<stdio.h>
int main()
{
	int n;
	double s=0;
	scanf("%d",&n);
	for(int i=0,t; i!=n; ++i)
	{
		scanf("%d",&t);
		s+=t;
	}
	printf("%.2lf",s/n);
}

谁拿了最多奖学金

用 scanf 输入时要占位符加空格。 比 cin 不晓得高到哪里去了?!

#include<stdio.h>
#include<string.h>
int main()
{
	int n,sum=0,ans_money=0;
	char gb,xb,name[32],ans_name[32];
	scanf("%d",&n);
	for(int money,qm,py,lw; n--; sum+=money)
	{
		scanf("%s %d %d %c %c %d",name,&qm,&py,&gb,&xb,&lw);
		money=0;
		if(qm>80&&lw)
			money+=8000;
		if(qm>85&&py>80)
			money+=4000;
		if(qm>90)
			money+=2000;
		if(qm>85&&xb=='Y')
			money+=1000;
		if(py>80&&gb=='Y')
			money+=850;
		if(ans_money<money)
		{
			ans_money=money;
			strcpy(ans_name,name);
		}
	}
	printf("%s\n%d\n%d",ans_name,ans_money,sum);
}