题解:补♂课第10场

Overview

A - 凑十个题

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

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

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);
        }
    }
}

C - 平衡饮食

通过预处理降低代码量。

#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");
}

D - 求出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);
}

E - 数制转换

偷个懒,直接用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]);
}

F - 合唱队形

为了方便,给每名队员重新编号,新编号从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);
}

G - 细菌繁殖

直接按日模拟。

#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);
    }
}

H - 肿瘤面积

#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));
}

I - 求平均年龄

#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);
}

J - 谁拿了最多奖学金

用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);
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值