【离散化】挤牛奶

这篇博客介绍了一个编程问题,涉及多个农民在不同时间挤奶的情况。任务是根据农民的挤奶时间列表,找出最长的至少有一人在挤奶的时间段和最长的无人挤奶的时间段。通过离散化和使用布尔变量来跟踪是否有人在工作,可以解决这个问题。给出的样例输入和输出展示了具体的操作过程。
摘要由CSDN通过智能技术生成

题目:

三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300时刻(从5点开始计时,秒为单位)给他的牛挤奶,一直到1000时刻。第二个农民在700时刻开始,在 1200时刻结束。第三个农民在1500时刻开始2100时刻结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300时刻到1200时刻),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200时刻到1500时刻)。
  你的任务是编一个程序,读入一个有N个农民(1 <= N <= 5000)挤N头牛的工作时间列表,计算以下两点(均以秒为单位):
• 最长至少有一人在挤奶的时间段。
• 最长的无人挤奶的时间段。


输入:

Line 1: 一个整数N。
Lines 2…N+1: 每行两个小于1000000的非负整数,表示一个农民的开始时刻与结束时刻。


输出:

一行,两个整数,即题目所要求的两个答案。


样例输入:

3
300 1000
700 1200
1500 2100

样例输出:

900 300

思路:

离散化,加一个bool变量记录有没有人工作就好了


C o d e Code Code:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
long long a[10001][10001],f[10001];
long long n,k,maxn,maxnn,ans;
bool check;
int main ()
{
	scanf("%lld",&n);
	for (int i = 1; i <= n; ++i)
	{
		scanf("%d%d",&a[i][1],&a[i][2]);
		f[++k] = a[i][1];//相当于离散化的左右端点
		f[++k] = a[i][2];
	}
	sort (f + 1, f + 1 + k);
	for (int i = 1; i < k;++i)
	   {
	   	check=0;//记录有没有人工作
	      for (int j = 1; j <= n; ++j )
	      {
	    	  if(f[i+1]>a[j][1] && f[i+1]<=a[j][2])//在范围内
	    	  {
	    		ans+=f[i+1]-f[i];//加上时间
	    		maxn=max(maxn,ans);//maxn是时间
	    		check=1;//有人
	    		break;
	          }
	      }
	    	  if(!check)//如果没人
	    	  {
	    		maxnn=max(maxnn,f[i+1]-f[i]);//加上
	    		ans=0;//清零
	          } 
	    	
	}
	printf("%lld %lld",maxn,maxnn);//输出
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值