农田灌溉

分析问题

本题要求计算两套灌溉系统同时工作的时间段。每个系统的工作时间是一个左闭右开区间,即系统1的工作时间为 ([S1, E1)),系统2的工作时间为 ([S2, E2))。同时工作的时间段是这两个区间的交集。交集的计算需要找到两个区间的重叠部分:

  • 交集的开始时间是两个开始时间的最大值(即 (max(S1, S2)))。
  • 交集的结束时间是两个结束时间的最小值(即 (min(E1, E2)))。
  • 如果交集的开始时间小于结束时间,则交集存在,同时工作的小时数为结束时间减开始时间;否则,交集不存在,同时工作时间为0。

建立模型

数学模型可以表示为: 开始 输入四个整数:S1, E1, S2, E2

计算交集的开始时间 = 取S1和S2中的较大值 计算交集的结束时间 = 取E1和E2中的较小值

计算重叠时间 = 交集的结束时间 – 交集的开始时间

如果 重叠时间 > 0 则 输出 重叠时间 否则 输出 0 结束 模型确保了当没有重叠时,结果为0。

编写代码

根据上述模型,编写C++代码实现:

#include <bits/stdc++.h>
using namespace std;
int main(){
int s1,e1,s2,e2;
cin>>s1>>e1>>s2>>e2;
int startTime,endTime;
//找出开始时间最晚的一个
startTime = s1;
if(s2>startTime) startTime = s2;
//找出开始时间最晚的一个
endTime = e1;
if(e2<endTime) endTime = e2;
//endTime > startTime时输出差值,否则输出0。
if(endTime>startTime){
//有重叠时,算出差值
cout<<endTime-startTime;
}else{
//没有重叠时,直接输出0
cout<<"0";
}
return 0;
}

代码解释:

  1. 读入四个整数 (S1, E1, S2, E2)。
  2. 计算交集的结束时间(min(e1, e2))和开始时间(max(s1, s2))。
  3. 计算差值,如果差值为负,说明没有重叠,使用 max(0, overlap) 确保输出0。
  4. 输出结果。

这种方法简洁高效,时间复杂度为 (O(1)),适用于所有输入情况。