Milking Cows
第一种方法 标记一下开始和结束时间 然后扫一遍 就能得出答案了
#include<cstdio> #include<cstring> const int maxn=1000000+5; int vis[maxn]; int main() { int n,x,y; scanf("%d",&n); memset(vis,0,sizeof(vis)); int up=0; for(int i=0;i<n;i++) { scanf("%d%d",&x,&y); if(y>up) up=y; vis[x]++; vis[y]--; } int ans1=0,ans2=0; int cur=0,cnt1=0,cnt2=0; bool start=false; for(int i=0;i<=up;i++) { if(vis[i]) start=true; cur+=vis[i]; if(cur>0) { cnt1++; if(cnt2>ans2) ans2=cnt2; cnt2=0; } else if(cur==0) { if(start) cnt2++; if(cnt1>ans1) ans1=cnt1; cnt1=0; } } printf("%d %d\n",ans1,ans2); return 0; }
第二种方法 按开始时间排序 然后
从左到右扫一遍,记录一个当前区间,[tmp.begin , tmp.end]
如果下一组数据的begin比tmp.end的小(或相等),则是连接起来的,检查这组数据的end,取max{end , tmp.end}。
如果下一组数据的begin比tmp.end的大,则是相互断开的,整理本区间,ans1取max{tmp.end - tmp.begin , ans1}。ans2取max{begin - tmp.end , ans2}
#include<cstdio> #include<algorithm> using namespace std; const int maxn=5000+5; struct farmer { int begin; int end; bool operator <(const farmer &a) const { return begin<a.begin; } }a[maxn]; int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&a[i].begin,&a[i].end); sort(a,a+n); farmer tmp=a[0]; int ans1=a[0].end-a[0].begin,ans2=0; for(int i=1;i<n;i++) { if(a[i].begin<=tmp.end) tmp.end=max(tmp.end,a[i].end); else { ans1=max(ans1,tmp.end-tmp.begin); ans2=max(ans2,a[i].begin-tmp.end); tmp=a[i]; } } printf("%d %d\n",ans1,ans2); return 0; }