【手把手刷CCF】201809-2-买菜100分(含详细注释)

简介: 【手把手刷CCF】201809-2-买菜100分(含详细注释)

前言

一、🌳🌳🌳思路如下

//代码中有写了许多注释哦

📢1、存储:

没有用结构体,直接用的数组,h[i]-h[i+1]是小H第i个时间段的装车时间,w[j]-w[j+1]是小W第i个时间段的装车时间。

📣2、算法思路

主体:两个for循环;外层是对小H的每个时间段,内层是对小W的每个时间段。

计算的情况共三种:
(1)、if(w[j]>h[i+1]){//w[j]开始时间>h[i+1]结束时间

即此时小W的第j个开始时间>小H第i个结束时间,对于W的时间继续循环增长与小H的此段肯定不会有交集的(恒大)。果断break;

(2)、else if(w[j+1]<h[i]){//w[j+1]结束时间<h[i]开始时间
即此时小W的第j个结束时间>小H第i个开始时间,W结束太早了,所以需要继续增长,跳到下一个时间段continue;

==剪枝==:在continue;前有flag=j+2;用于剪枝,因为如果每次都从j=0开始的话,许多数据都需要continue,所以用flag来记录小W的第flag个时间段刚好可以与小H的对应时间段有交叉。
(其实不剪枝也可以100分,两者的提交结果在“三、🔥🔥🔥提交结果”给出)。

(3)、除去(1)(2)两种情况剩下就是有交叉的啦,直接计算即可。
两个段的交叉如何计算?当然是用两者较小的结束时间减去两者较大的开始时间,即得两者的公共部分。可以再看图带入这个计算过程。

一句代码搞定:MeetTime=MeetTime+min(h[i+1],w[j+1])-max(h[i],w[j]);

二、🌟🌟🌟代码如下:

// 201809-2 买菜

#include <iostream>

using namespace std;
#define N 4002
int n;//n个时间段 
int h[N];//存h的时间段 
int w[N];//存w的时间段 
long long MeetTime;//记录见面时间 

int max(int m,int n){//自写取较大值的函数 
    if(m>n) return m;
    else return n;
}

int min(int m,int n){//自写取较小值的函数 
    if(m<n) return m;
    else return n;
}

void input(){//输入 
    cin>>n;
    for(int i=1;i<2*n;i=i+2){//输入h 
        cin>>h[i]>>h[i+1];
    } 
    for(int i=1;i<2*n;i=i+2){//输入w 
        cin>>w[i]>>w[i+1];
    }
} 

void output(){//输出 
    for(int i=1;i<2*n;i=i+2){//输入h 
        cout<<h[i]<<" "<< h[i+1]<<endl;
    }cout<<endl;
     
    for(int i=1;i<2*n;i=i+2){//输入n 
        cout<<w[i]<<" "<<w[i+1]<<endl;
    }cout<<endl;
} 

void sum(){//计算 
    int flag=1;
    for(int i=1;i<2*n;i=i+2){
        for(int j=1;j<2*n;j=j+2){
            if(w[j]>h[i+1]){//w[j]开始时间>h[i+1]结束时间 
                break;//中断 
            }
            else if(w[j+1]<h[i]){//w[j+1]结束时间<h[i]开始时间 
                flag=j+2;
                continue;
            }
            else{//用两者结束时间较小值-两者开始时间较大值(即两者此时间段的交叉时间) 
                MeetTime=MeetTime+min(h[i+1],w[j+1])-max(h[i],w[j]);
            }
        }
    }
    cout<<MeetTime<<endl; 
}

int main(){
    input();
    //output(); //检验自己输入是否正确 
    sum();
    return 0;
} 

三、🔥🔥🔥提交结果:

不剪枝的sum()函数代码,其余皆一致:

void sum(){//计算 
    for(int i=1;i<2*n;i=i+2){
        for(int j=1;j<2*n;j=j+2){
            if(w[j]>h[i+1]){//w[j]开始时间>h[i+1]结束时间 
                break;//中断 
            }
            else if(w[j+1]<h[i]){//w[j+1]结束时间<h[i]开始时间 
                continue;
            }
            else{//用两者结束时间较小值-两者开始时间较大值(即两者此时间段的交叉时间) 
                MeetTime=MeetTime+min(h[i+1],w[j+1])-max(h[i],w[j]);
            }
        }
    }
    cout<<MeetTime<<endl; 
}
emm……两者的时间使用是一样的,只不过节省了点空间。 (👻平时当然要养成好习惯啦👻)

四、🌞🌞🌞题目如下:

❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭!

一起加油哦!💕💕💕
目录
相关文章
|
1月前
|
存储 机器学习/深度学习 算法
北京化工大学历年真题整理:没考上,换了个学校,但还是在北京~哈哈(总结的算法题,有缘人自取之)
这份文件是北京化工大学历年算法真题的整理,包括选择题和算法题的总结,以及一些必背的算法知识点,帮助考生备考。
35 2
|
5月前
|
存储 索引
6/1 第十五届蓝桥杯国赛pb组 真题本人答案 仅供参考
6/1 第十五届蓝桥杯国赛pb组 真题本人答案 仅供参考
80 4
|
测试技术 C++ Python
【浙江大学PAT真题练习乙级】1003 我要通过!(20分) 真题解析
【浙江大学PAT真题练习乙级】1003 我要通过!(20分) 真题解析
122 0
|
测试技术 C++ Python
【浙江大学PAT真题练习乙级】1005 继续(3n+1)猜想 (25分) 真题解析
【浙江大学PAT真题练习乙级】1005 继续(3n+1)猜想 (25分) 真题解析
|
C++ Python
【浙江大学PAT真题练习乙级】1001 害死人不偿命的(3n+1)猜想(15分)真题解析
【浙江大学PAT真题练习乙级】1001 害死人不偿命的(3n+1)猜想(15分)真题解析
|
缓存 移动开发 前端开发
字节前端二面凉凉记录,晋级赛失败
面试日期为 2021-06-06 18:00 接着上回一面后,有个人给我打电话了,问我可不可以二面,我毕竟抱着学习的态度来面试的,但是万一成了呢,我突然紧张了。感觉答应的唐突了,但是感觉没事,毕竟滴滴二面时那种八股文我已经又准备了一遍。
|
存储 机器学习/深度学习 算法
【第十四届蓝桥杯考前速成】必考知识点及代码模板总结,看完至少多拿50分
四、简单图论 1、单源最短路径 2、多源最短路 3、最小生成树 五、动态规划 1、0-1背包 2、完全背包 3、多重背包 4、线性DP 总结
161 0
|
机器学习/深度学习 存储 人工智能
【第十四届蓝桥杯】第三期官方校内模拟赛B组C++题解(已修正完毕,均可AC100%)
文章目录 写在前面 一、字母数(AC100%) 题目描述 解题报告 1、大体思路 2、代码详解 二、列名(AC100%) 题目描述 解题报告 1、大体思路 2、代码详解 三、特殊日期(AC100%) 题目描述 解题报告 1、大体思路 2、代码详解 四、大乘积(AC100%) 题目描述 解题报告 1、大体思路 2、代码详解 ==五、最大连通==(已修正) 题目描述 解题报告 1、大体思路 2、代码详解 六、星期几(AC100%) 题目描述 解题报告 1、大体思路 2、代码详解 七、信号覆盖(AC100%) 题目描述 解题报告 1、大体思路 2、代码详解 八、清理水域(AC100%) 题目描述 解
462 0
|
算法 数据库
程序人生 - 祝贺登榜《数据结构与算法领域内容榜》NO.29
程序人生 - 祝贺登榜《数据结构与算法领域内容榜》NO.29
96 0
程序人生 - 祝贺登榜《数据结构与算法领域内容榜》NO.29
|
算法 数据库
程序人生 - 祝贺登榜《数据结构与算法领域内容榜》NO.49
程序人生 - 祝贺登榜《数据结构与算法领域内容榜》NO.49
97 0
程序人生 - 祝贺登榜《数据结构与算法领域内容榜》NO.49
下一篇
无影云桌面