洛谷第二次题单总结(12.18)(分支结构)

文章讲述了编程中的几个问题,如苹果消耗的逻辑、整数特性判断、BMI计算、有效数字显示和勾股数应用,涉及IT技术和数学应用
摘要由CSDN通过智能技术生成

题目:苹果和虫子

八尾勇喜欢吃苹果。她现在有 m(1≤m≤100)个苹果,吃完一个苹果需要花费 t(0≤≤t≤100)分钟,吃完一个后立刻开始吃下一个。现在时间过去了 s(1≤s≤10000)分钟,请问她还有几个完整的苹果?

输入:

输入三个非负整数表示 m,t,s。

输出:

输出一个整数表示答案。

输入样例:

50 10 200

输出样例:

30

解题思路:这题乍一看很简单(实则确实很简单),那我为什么总结这个问题呢,是因为他有三个需要考虑的坑,我就考虑了其中一个。那么给大家现在介绍一下这题的坑有哪些?

1.s是否能够整除t,因为题目中说的是还剩下几个完整的苹果,像是s不能整除t,也就是说明有一个苹果还在吃,但没完全吃完,但那个也算是不完整的苹果,所以我们在代码中要有一个判断操作,判断s是否能整除t

2.是否会存在时间过长导致s除t的值比m还要大,这样我们在代码中得出的结果是m-s/t,但是由于后者很大,所以说当结果是负数的时候,让结果变成0

3.是否存在t==0的情况,那么的话就要特判了,一瞬间就可以吃完,因此也要输出0这个是本题最难想到的坑了)(但是洛谷的下面会有注意,大家心细一点就能看到)

#include <stdio.h>
int main()
{
    int m,t,s;
    scanf("%d%d%d",&m,&t,&s);
    if(t==0)//特判t为0的情况
    {
        printf("0\n");
        return 0;
    }
    else
    {
        int flag=s/t;
        if(s%t==0)//判断是否存在吃了但没完全吃完的情况
        {
            flag=flag;
        }
        else
        {
            flag=flag+1;
        }
        int z=m-flag;//得出结果
        if(z<=0)//这个就是要考虑第二个坑部分的代码,就是时间过长的情况
        {
            z=0;
        }
        printf("%d\n",z);
        return 0;
    }
}

题目:数的性质

一些整数可能拥有以下的性质:

  • 性质 1:是偶数;
  • 性质 2:大于 44 且不大于 1212。

小 A 喜欢这两个性质同时成立的整数;Uim 喜欢这至少符合其中一种性质的整数;八尾勇喜欢刚好有符合其中一个性质的整数;正妹喜欢不符合这两个性质的整数。现在给出一个整数 x,请问他们是否喜欢这个整数?

输入:

输入一个整数 x(0≤x≤1000)

输出:

输出这 4 个人是否喜欢这个数字,如果喜欢则输出 1,否则输出 0,用空格分隔。输出顺序为:小 A、Uim、八尾勇、正妹。

样例输入:

12

样例输出:

1 1 0 0

解题思路,首先这题就是洛谷上的算是水题吧,给大家刷自信用的,但是由于博主太小白了,还是在细节处理上错了,因此给大家总结出来,只需要给四个人加上各自准确的条件

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a=0,b=0,c=0,d=0;
    if(n%2==0&&n>4&&n<=12)//小A是要求两个条件都满足
    {
        a=1;
    }
    if(n%2==0||(n>4&&n<=12))//uim是要求两个满足一个即可
    {
        b=1;
    }
    if((n%2==0&&n<=4||n>12)||(n%2!=0&&n>4&&n<=12))
    //八尾勇是要两个条件只能满足一个
    //(但第二个条件不能是(n<=4&&n>12))这样不符合数学公式昂
    //那为什么博主一开始写成这个,可能是因为脑子不够用吧,又失误了,可恶!
    {
        c=1;
    }
    if(n%2!=0&&n<=4||n>12)//正妹是两个都不能满足
    {
        d=1;
    }
    printf("%d %d %d %d\n",a,b,c,d);
    return 0;
}

题目:肥胖问题

BMI 指数是国际上常用的衡量人体胖瘦程度的一个标准,其算法是 m/(h*h),其中 m 是指体重(千克),ℎh 是指身高(米)。不同体型范围与判定结果如下:

  • 小于 18.518.5:体重过轻,输出 Underweight
  • 大于等于 18.518.5 且小于 2424:正常体重,输出 Normal
  • 大于等于 2424:肥胖,不仅要输出 BMI 值(使用 cout 的默认精度),然后换行,还要输出 Overweight

现在给出体重和身高数据,需要根据 BMI 指数判断体型状态并输出对应的判断。

对于非 C++ 语言,在输出时,请四舍五入保留六位有效数字输出,如果小数部分存在后缀 0,不要输出后缀 0。

请注意,保留六位有效数字不是保留六位小数。例如 123.4567123.4567 应该输出为 123.457123.457,5432.105432.10 应该输出为 5432.15432.1。

输入:

共一行。

第一行,共 2个浮点数,m,h,分别表示体重(单位为 kg),身高(单位为 m)。

输出:

输出一行一个字符串,表示根据 BMI 的对应判断。特别地,对于 Overweight 情况的特别处理请参照题目所述。

样例输入:

100 1.68

样例输出:

35.4308
Overweight

解题思路:这题是一个很简单的题,这题唯一的知识点就是有效数字的输出

#include <stdio.h>
int main()
{
    double m,h;
    scanf("%lf%lf",&m,&h);
    double flag=m/h/h;
    if(flag<18.5)
    {
        printf("Underweight\n");
    }
    if(flag>=18.5&&flag<24)
    {
        printf("Normal\n");
    }
    if(flag>=24)
    {
        printf("%.6g\n",flag);//这个就是输出有效数字的方法%.ng(n指的是几位有效数字)
        printf("Overweight\n");
    }
    return 0;
}

题目:不高兴的津津

津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

输入:

输入包括 77 行数据,分别表示周一到周日的日程安排。每行包括两个小于 1010 的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。

输出:

一个数字。如果不会不高兴则输出 00,如果会则输出最不高兴的是周几(用 1,2,3,4,5,6,71,2,3,4,5,6,7 分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。

输入样例:

5 3
6 2
7 2
5 3
5 4
0 4
0 6

输出样例:

3

解题思路:这题其实也是一个水题,可以用两个数组来存储每天在学校上课的时间和课外学习时间

然后用一个for循环求出每天学习时间总长,若是大于八个小时就要进行与最长学习时间的比较,若是大于最长学习时间就需要更新最不高兴的一天(这边我见了很多人没有考虑到学习时间是否大于8的情况导致出现了WA)

#include <stdio.h>
int main()
{
    int a[10]={0},b[10]={0};
    int sum=0,max=0,max1=0;
    //sum是用于计算每天学习的时间,max用于存储哪天最不高兴,max1用于存储最长学习时间
    for(int i=1;i<=7;i++)//遍历循环周一到周天
    {
        scanf("%d%d",&a[i],&b[i]);//循环输入每天的课内时间和课外时间
    }
    for(int i=1;i<=7;i++)//遍历循环周一到周天
    {
        sum=0;
        sum=a[i]+b[i];
        if(sum>max1&&sum>8)//判断条件,本天学习时间是否超过最长学习时间以及是否超过八个小时
        {
            max=i;
            max1=sum;
        }
    }
    printf("%d\n",max);//输出最不高兴的是周几
    return 0;
}

题目:买铅笔

P 老师需要去商店买 n 支铅笔作为小朋友们参加 NOIP 的礼物。她发现商店一共有 33 种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P 老师决定只买同一种包装的铅笔。

商店不允许将铅笔的包装拆开,因此 P 老师可能需要购买超过 n 支铅笔才够给小朋友们发礼物。

现在 P 老师想知道,在商店每种包装的数量都足够的情况下,要买够至少 n 支铅笔最少需要花费多少钱。

输入:

第一行包含一个正整数 n,表示需要的铅笔数量。

接下来三行,每行用 2 个正整数描述一种包装的铅笔:其中第 11 个整数表示这种包装内铅笔的数量,第 2 个整数表示这种包装的价格。

保证所有的 7 个数都是不超过 10000的正整数。

输出:

1 个整数,表示 P 老师最少需要花费的钱。

输入样例:

9998
128 233
128 2333
128 666

输出样例:

18407

解题思路:这题就是水题一个没啥考察的知识点,设两个数组,一个存储数列一个存储价格就好,但是记得把min这个最小价格一开始初始化的大一点

#include <stdio.h>
int a[10]={0},b[10]={0};//a数组用于存储数量,b数组用于存储价格
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<3;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
    }
    int count=0;
    int price=0,min=1000000000;//定义总价price变量还有要作为对比的最小值min
    for(int i=0;i<3;i++)
    {
        count=n/a[i];//这个是看要买多少盒,因为不能独立包装,只能按一整盒买
        if(n%a[i]!=0)//判断是否会整除,不能整除就再加一盒
        {
            count++;
        }
        price=count*b[i];//价格=数量*单价
        if(price<min)//如果此时的价格小于最小值,就更新最小值
        {
            min=price;
        }
    }
    printf("%d\n",min);//输出最小值(最少得价格)
    return 0;
}

题目:小鱼的航程

有一只小鱼,它平日每天游泳 250250 公里,周末休息(实行双休日),假设从周 x 开始算起,过了 n 天以后,小鱼一共累计游泳了多少公里呢?

输入:

输入两个正整数 x,n,表示从周 x 算起,经过 n 天。

输出:

输出一个整数,表示小鱼累计游泳了多少公里。

样例输入:

3 10

样例输出:

2000

说明/提示

数据保证,1≤x≤7,1≤n≤1e6。

解题思路:这道题需要想清楚整个过程,理解上去很简单,但是写代码的时候可能会出现小错误,那么直接放代码了

#include <stdio.h>
int main()
{
    unsigned long long x,n;//天数已经很大了,所以尽量给数据开的大一点
    scanf("%llu%llu",&x,&n);
    unsigned long long sum=0;//用于计算总航程的变量sum
    for(int i=0;i<n;i++)
    {
        if(x>0&&x<6)//当天数处于周一到周五的时候
        {
            sum+=250;//每天航程+250
            x++;//轮到下一天
        }
        else//当天数处于周六周天的时候
        {
            x++;//只会增加天数,航程不变
        }
        if(x==8)//当过完周天,x++后会变成8,当x==8时说明下一次该轮到星期一了,所以x=1
        {
            x=1;
        }
    }
    printf("%llu\n",sum);
    return 0;
}

题目:三角函数

输入一组勾股数a,b,c(a!=b!=c),用分数格式输出其较小锐角的正弦值。(要求约分。)

输入格式

一行,包含三个正整数,即勾股数 a,b,c(无大小顺序)。

输出格式

一行,包含一个分数,即较小锐角的正弦值

解题思路:这题要求输入一组勾股数,勾股数就是直角数很简单,只需要给a,b,c进行排序,然后找出最小和最大的两个数就可以输出较小的锐角的正弦值,但是问题在于如何约分:因此我们会有两种方法,这两种方法我就放在另一篇我的博客(今天晚上就会发表出来)里面了,大家可以自行查阅

#include<stdio.h>
int gcd(int a,int b)//实现求最大公因数的辗转相除法,这个是递归的写法
{
    if(b==0)
    {
        return a;
    }
    return gcd(b,a%b);
}
int main()
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    int t;
    if(a>b)//用来对a,b,c,进行排序
    {
        t=a;
        a=b;
        b=t;
    }
    if(b>c)
    {
        t=b;
        b=c;
        c=t;
    }
    if(a>b)
    {
        t=a;
        a=b;
        b=t;
    }
    int z=gcd(a,c);//z就是通过调用gcd函数求出的最大公因数
    a=a/z;//实现约分的操作
    c=c/z;
    printf("%d/%d",a,c);
    return 0;
}

  • 36
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值