蓝桥杯算法心得——小郑躲太阳(思维推导)

大家好,我是晴天学长,一道与平时的题型截然不同的题型,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪


1) .小郑躲太阳

问题描述
小郑一觉醒来发现起晚啦!现在需要从家里飞速前往公司,对他来说,路线是唯一的。
可以把小郑的上班路径看作是一条直线, 其中有一些位置能被太阳直射,而有一些被遮住了。
小郑步行每秒的移动速度是1海秒,步行不花费体力。
路径长度为s,有n个不相交的整数区间l到r,示这部分[I,r之间被遮蔽了。
小郑-开始有c的体力,他可以耗费每秒1点体力慢跑一会儿, 这样,他就可以在这段时间内获得2米海秒的移动速度。
小郑也可以耗费每秒3点体力)冲刺一会儿, 这样,他就可以在这段时间内获得3米海秒的移动速度。
注意:时间是连续的,例如,小郑可以花费2点体力冲刺2/3秒。
小郑可以在任意时间决定他的移动方式,但他希望被晒到太阳的时间最短。

输入格式
第一行输入三个整数s,n,c,代表路径的总长度,被遮蔽区间的个数和小郑的初始体力。
接下来n行,每行两个整数l,r表示[I,r]这段区间被遮蔽了。

输出格式
输出小郑最少要被太阳晒到的时间(四舍五入保留6位小数)。

样例输入1
1006 10

样例输出1
90.90000

样例输入2
100 2 20
10 26
60 168


2) .算法思路

小郑躲太阳

遮蔽区可以删去

1.有全程慢跑的体力,不够只能不够了

2.慢跑用不完能量的时候,可以冲刺一波


3).算法步骤


1.读取输入的行,并解析为长整型变量s、n和c,分别表示总距离、阴影区域的数量和冲刺能力。

2.初始化变量res为0,用于记录阴影区域的总长度。

3.使用循环读取每个阴影区域的起始位置和结束位置,并将其长度累加到res中。

4.将总距离s减去阴影区域的总长度,得到剩余未被阴影覆盖的距离s。

5.检查特殊情况,如果冲刺能力的两倍恰好等于剩余距离s,说明可以全程慢跑,输出结果为剩余距离s除以2.0。

6.检查特殊情况,如果冲刺能力大于等于剩余距离s,说明可以全程步行,输出结果为剩余距离s除以3.0。

7.如果冲刺能力的两倍大于剩余距离s,表示有多余的体力。

8.计算第一次冲刺的时间t1,即冲刺能力的两倍减去剩余距离s。

9.计算第一次冲刺的距离s1,即第一次冲刺的时间t1除以3.0乘以3(每分钟跑3米)。

10.计算第二次冲刺的时间t2,即剩余距离s减去第一次冲刺的距离s1除以2.0。

11.计算总时间t,即第一次冲刺的时间t1加上第二次冲刺的时间t2。

12.输出结果为总时间t,保留小数点后六位。

13.刷新输出流。


4). 代码实例

java 复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;

public class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new PrintWriter(System.out));
    static String[] lines;

    public static void main(String[] args) throws IOException {
        lines = in.readLine().split(" ");
        long s = Long.parseLong(lines[0]);
        long n = Long.parseLong(lines[1]);
        long c = Long.parseLong(lines[2]);
        //阴影区域
        long res = 0;
        for (int i = 0; i < n; i++) {
            lines = in.readLine().split(" ");
            long l = Long.parseLong(lines[0]);
            long r = Long.parseLong(lines[1]);
            res += r-l;
        }
        s-=res;
        //看是否能全程慢跑(有刚好的情况)
        if (c*2==s){
            out.println(String.format("%.6f",s/2.0));
        }
        else if(c>=s){
            out.println(String.format("%.6f",s/3.0));
        }
        //有多余的体力
        else if (c*2>s){

            //冲刺
            double t1 = (c*2-s);
            double s1 = (t1/3)*3;
            double t2 = (s-s1)/2.0;
            double t = t1+t2;
            out.println(String.format("%.6f",t));

        }
        //不能全程跑
        else {
            double t1 = c*2;
            double t2 = s-t1;
            double t = c+t2;
            out.println(String.format("%.6f",t));
        }
        out.flush();
    }
}

4).总结

  • 思维推导题,情况分类。

试题链接:

相关推荐
renhongxia14 分钟前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了4 分钟前
数据结构之树(Java实现)
java·算法
算法备案代理7 分钟前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.31 分钟前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
野犬寒鸦2 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
霖霖总总2 小时前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法
rainbow68892 小时前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法
觉醒大王2 小时前
AI写的青基中了
人工智能·笔记·深度学习·学习·职场和发展·学习方法
wangjialelele2 小时前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先
驱动探索者3 小时前
linux mailbox 学习
linux·学习·算法