目录:
- 前言
- 一、思路如下
-
-
- 1、存储:
- 2、算法思路
-
- 二、代码如下:
- 三、提交结果:
- 四、题目如下:
- ??????忙碌的敲代码也不要忘了浪漫鸭!
前言
?你好啊,我是“ 怪& ”,是一名在校大学生哦。一、思路如下
主页链接:怪&的个人博客主页
??博文主更方向为:课程学习知识、作业题解、期末备考。随着专业的深入会越来越广哦…一起期待。
??一个“不想让我曾没有做好的也成为你的遗憾”的博主。
很高兴与你相遇,一起加油!
//代码中有写了许多注释哦二、代码如下:
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]
即此时小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 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;
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
couth[i+1]结束时间
break;
//中断
}
else if(w[j+1]
三、提交结果:
文章图片
不剪枝的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]
其提交结果:
文章图片
emm……两者的时间使用是一样的,只不过节省了点空间。(平时当然要养成好习惯啦)四、题目如下: 【CCF-CSP|【手把手刷CCF】201809-2-买菜100分(含详细注释)】
文章图片
??????忙碌的敲代码也不要忘了浪漫鸭!
一起加油哦!
文章图片
推荐阅读
- 算法|有关for(auto x: vector<int>v)的问题
- OJ|阶乘分解 kkmd66
- 算法|746. 使用最小花费爬楼梯
- PTA|本题要求编写程序,以hh:mm:ss的格式输出某给定时间再过n秒后的时间值(超过23:59:59就从0点开始计时)。
- 面经|美团后端一二面c++
- 链表|链表的OJ题练习
- 图书管理系统简易版C++
- LeetCode编程题解法汇总|力扣解法汇总2038- 如果相邻两个颜色均相同则删除当前颜色
- 极客日报|称钉钉将上线“下班勿扰”功能;苹果发生大规模网络宕机;.NET 7 Preview 2发布|极客头条