本文主要是介绍挤牛奶洛谷uasco,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
三个农民每天清晨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的非负整数,表示一个农民的开始时刻与结束时刻。
输出格式:
一行,两个整数,即题目所要求的两个答案。
题目大意就是给你一堆区间然你求重叠的区间中最长的是多少和不重叠的区间中空最多的是多少。
以前做过一些类似的题目 共同点是先用结构体将区间左端点和右端点存起来然后按左端点排序。
在定义一个中间变量用来存重叠区间的左右端点 当两区间重叠的时候只需要判断一下是否包含然后更新右端点,当不重叠的时候就可以求题目要求的了然后重复。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct qu
{int a,b;
} w[100000];
bool cmp(qu a,qu b)
{return a.a<b.a;
}
int main()
{int n;cin>>n;for(int i=1; i<=n; i++){cin>>w[i].a>>w[i].b;}sort(w+1,w+n+1,cmp);int s1=w[1].a,s2=w[1].b,max1=w[1].b-w[1].a,max2=0;for(int i=2; i<=n; i++){if(w[i].a<=s2&&w[i].b>s2){s2=w[i].b;}else if(w[i].a>s2){max2=max(max2,w[i].a-s2);max1=max(max1,s2-s1);s1=w[i].a;s2=w[i].b;}}cout<<max1<<' '<<max2<<endl;}
这篇关于挤牛奶洛谷uasco的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!