按照開始時間升序排序,而後從左到右掃一遍,記錄一個當前區間[tmp_first , tmp_second] 。若是下一組數據的first比tmp_second小或與之相等,則是鏈接起來的,檢查這組數據的second,取max(second , tmp_second)。 若是下一組數據的first比tmp_second的大,則是相互斷開的,整理本區間,ans1取max(tmp_second-tmp_first,ans1)。ans2取m(first-tmp_second,ans2)。node
/* ID:jzzlee1 PROG:milk2 LANG:C++ */ #include <fstream> #include <string> #include<iostream> #include <algorithm> #include <cstdio> using namespace std; struct node { int first, second; bool operator<(const node &r) const { return first < r.first; } }a[5000]; ifstream fin("milk2.in"); ofstream fout("milk2.out"); int max(int a,int b) { return a>b?a:b; } int main() { int n; fin>>n; for (int i = 0; i < n; ++i) fin>>a[i].first>>a[i].second; sort(a, a+n); int beg = a[0].first, end = a[0].second,ans1=0, ans2=0; for (int i=1; ;++i) { for(;i<n&&a[i].first<=end;++i) if (a[i].second>end) end=a[i].second; ans1=max(ans1,end-beg); if (i==n) break; ans2=max(ans2,a[i].first-end); beg=a[i].first; end=a[i].second; } fout<<ans1<<" "<<ans2<<endl; return 0; }