51Nod 1091 线段重叠 | 贪心
Input示例
5 1 5 2 4 2 8 3 7 7 9
Output示例
4
first try:
O(n^2):二层循环,减法取最大
后五个time limit exceeded
#include "bits/stdc++.h" using namespace std; #define LL long long #define INF 0x3f3f3f3f3f #define PI acos(-1) #define N 50010 #define MOD 10 using namespace std; struct unit{ int s,e; }arr[N]; bool cmp(struct unit&a,struct unit&b){//起点升序终点升序 if(a.s==b.s) return a.e<b.e; return a.s<b.s; } int main() { int n,t,m; while(~scanf("%d",&n)){ for(int i=0;i<n;i++){ scanf("%d%d",&arr[i].s,&arr[i].e); } sort(arr,arr+n,cmp); int MAX=-INF,tt; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(arr[j].e>=arr[i].e) tt=arr[i].e-arr[j].s; else tt=arr[j].e-arr[j].s; MAX=MAX>tt?MAX:tt; } } if(MAX<0){ puts("0"); } else printf("%d\n",MAX); } return 0; }
second try:
线扫(线性扫一遍O(n))
以起点升序,终点降序排列。线性扫一遍,贪心取最大值。
#include "bits/stdc++.h" using namespace std; #define LL long long #define INF 0x3f3f3f3f3f #define PI acos(-1) #define N 50010 #define MOD 10 using namespace std; struct unit{ int s,e; }arr[N]; bool cmp(struct unit&a,struct unit&b){ if(a.s==b.s) return a.e>b.e; return a.s<b.s; } int main() { int n,t,m; while(~scanf("%d",&n)){ for(int i=0;i<n;i++){ scanf("%d%d",&arr[i].s,&arr[i].e); } sort(arr,arr+n,cmp); int ans=0; int ed=arr[0].e; for(int i=1;i<n;i++){ ans=max(ans,min(ed,arr[i].e)-arr[i].s); ed=max(ed,arr[i].e); } printf("%d\n",ans); } return 0; }