玩命加载中 . . .

洛谷官方题单——分支结构题解(水题警告)


依旧水题警告,不多BB,直接上。

题目0:数的性质

实际上就是简单的与(&),或(|)以及条件复合的基本用法。

    scanf("%d", &x);
    bool a = !(x & 1), b = (x > 4 && x <= 12);   //a表示题目性质1,b表示题目性质2
    printf("%d %d %d %d", a & b, a | b, (a && !b || b && !a), !a && !b);

题目1:闰年判断

实际上注意整百年的情况,整百年的情况下必须是400的倍数才可以。原因自行百度嗷。

    printf("%d\n",(n%4==0&&n%100!=0)||(n%400==0));

题目2:Apples

简单的输入输出,只要你具备基本的英语知识(apple的复数形式为apples)

    if(n<=1) return 0*printf("Today, I ate %d apple.",n);
    else return 0*printf("Today, I ate %d apples.",n);

题目3:洛谷团队系统

设题目为n,则本地配置需要5n,而上传则为3n+11,令5n>3n+11有n>5.5,因此直接判断

    if((n*1.0)>5.5) return 0*printf("Luogu\n");
    else return 0*printf("Local\n");

题目4:肥胖问题

即BMI的计算方法- -,顺带一提,疫情过后各位的BMI怎么样了鸭(滑稽),另外由于题目要求有效数字,所以最好是采用cout输出。

    double m, h, bmi;
    cin >> m >> h;
    bmi = m / (h * h);
    if (bmi < 18.5) cout << "Underweight" << endl;
    if (bmi >= 18.5 && bmi < 24)
        cout << "Normal";
    if (bmi >= 24)
        cout << bmi << endl << "Overweight" << endl;

题目5:三位数排序

这里我用的std::sort,没啥技术含量,直接略过。

题目6:月份天数

运用的打表的方法,对于大部分人来说都是基操。

int M[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //提前打个表
int main(){
    int year,month;
    scanf("%d%d",&year,&month);
    if((year%4==0&&year%100!=0)||year%400==0) M[2]=29;
    return 0*printf("%d\n",M[month]);
}

题目7:不高兴的津津

直接边读边比较就行了,这道题过水。

    for (i=0;i<7;i++){
        scanf("%d%d",&a,&b);
        s=a+b;
        if ((s>max)&&(s>8)) max=s,day=i
    }
    printf("%d",day);    

题目8:买铅笔

表示这道题是我早期做的一道题了,题解看看就完事。

#include<stdio.h>
int main(){
   int n, n1, p1, n2, p2, n3, p3, a1, a2, a3, fir=0, sec=0, thi=0;
   scanf("%d%d%d%d%d%d%d", &n,& n1,&p1, &n2, &p2,& n3,& p3);//早期写法这样太蠢了,不适合拓展
   a1 = ((n - 1 + n1) / n1)*p1, a2 = ((n - 1 + n2) / n2)*p2, a3 = ((n - 1 + n3) / n3)*p3;
   if (a1 > a2) {
      if (a1 > a3){
         fir = a1;
         if (a2 > a3) sec = a2,thi = a3;
         else sec = a3,thi = a2;
      }
      else fir = a3,sec = a1,thi = a2;
   }
   else {
         if (a2 > a3){
             fir = a2; 
             if (a1 > a3) sec = a1,thi = a3;
             else sec = a3,thi = a1;
         }
      else fir = a3,sec = a2, thi = a1;
   }
    return 0*printf("%d", thi);
}

题目9:ISBN

比较暴力的方法,详见代码。

#include<stdio.h>
char a[11];
int main(){
    char t1, t2;
    int check=0;
    scanf("%c-%c%c%c-%c%c%c%c%c-%c",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8],&t1);
    for(int i=0;i<9;i++) check+= (i+1)*(a[i]-'0');//题解一里面有相关的解释
    t2=check%11+'0';
    if(t2=='0'+10) t2='X';
    if(t1==t2) printf("Right");
    else printf("%c-%c%c%c-%c%c%c%c%c-%c",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],t2);
    return 0;
}

题目10:电费

就是简单粗暴的分段函数desu。

    if(d<=150) y=0.4463*d;
    else if(d>150&&d<=400) y=0.4463*150+0.4663*(d-150);
    else y=0.4463*150+0.4663*250+(d-400)*0.5663;
    printf("%.1lf",y);//一位小数

题目11:小鱼的航程

具体的变量含义见注释。

   int x, b, c, d;
   long int n, a;
   scanf("%d%ld", &x, &n);
   b = n / 7;    //计算要多少个整周
   a = b * 250 * 5;//a表示的是答案,整周直接提前计算
   c = n - 7 * b;//还剩下了几天
   d = x;//从周几开始天开始
   while (c){
      if (d == 7) d = 1;//加入这周是周天,那么我们直接让他下一天变为周一
      else if (d <= 5) d++, a = a + 250;//工作日,给我游
      else d++;//表示周六的时候,不游
      c--;//剩余日期减1
   }
   return 0*printf("%ld", a);

题目12 :三角函数

由于是勾股数,故两个角都是锐角,正弦函数在(0,pi/2)的范围内随角度增加而增加,故较小锐角的正弦值为最小值/最大值,因此难点变为了约分,这里通过gcd来求解。

    int a[4];
    for (int i=0;i<3;i++) cin>>a[i];
    sort(a,a+3); 
    cout<<a[0]/__gcd(a[0],a[2])<<'/'<<a[2]/__gcd(a[0],a[2]);
    return 0;

题目13:淘淘摘苹果

提前存好遍历一遍就行了,主要是因为高度在最后才输入,因此不能边输入边cnt++。

   int a[10],int heigh,can,count=0;
   for(int i=0;i<10;i++) scanf("%d", &a[i]);
   scanf("%d", &heigh);
   can = heigh + 30;
   for (int i = 0; i < 10; i++) if (a[i] <= can) count++;
   return 0*printf("%d", count);

题目14:三角形分类

直接就是三角形判断。

    scanf("%d%d%d", &a, &b, &c);
    int d[4] = {0, a, b, c};//直接放在scanf输入也可以的,这里是懒= =
    sort(d + 1, d + 4);
    if(d[1] + d[2] <= d[3]) return 0*printf("Not triangle\n");
    if(d[1] * d[1] + d[2] * d[2] == d[3] * d[3])    printf("Right triangle\n");
    else if(d[1] * d[1] + d[2] * d[2] > d[3] * d[3])    printf("Acute triangle\n");
    else if(d[1] * d[1] + d[2] * d[2] < d[3] * d[3])    printf("Obtuse triangle\n");
    if(a == b || b == c || a == c)  printf("Isosceles triangle\n");
    if(a == b && b == c)    printf("Equilateral triangle\n");
    return 0;

题目15:ABC

按照规定的顺序输出三个数字,具体代码见下。

    int a[3];
    char A,B,C;
    cin>>a[0]>>a[1]>>a[2];
    cin>>A>>B>>C;
    sort(a,a+3);
    cout<<a[A-'A']<<" "<<a[B-'A']<<" "<<a[C-'A'];//通过求差来保证ABC的输出顺序
    return 0;

水题基本上没了,后面的题开始会有一点点难度了,欢乐水题就此结束。


文章作者: AleXandrite
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AleXandrite !
  目录