# 补♂课第10场解题报告

2017-11-28 18:59:16来源:CSDN作者:w_weilan人点击

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 - 数制转换

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 - 合唱队形

`f[0][i]`为第i名队员左边最多可站的人数，那么有这样的转移关系：`f[0][i]=max{0,f[0][j]}`，其中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]`的所有数。

``#include<stdio.h>int n,tmp=0,t[128]= {0},f[2][128]= {0};//全局数组声明的时候如果没有给初值则初始化为0int 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 - 谁拿了最多奖学金

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