UVA-1617 Laptop (贪心)
题目大意:有n条长度为1的线段,n个区间,第i条线段在第i个区间中,问线段之间的最少间隙有几个。
题目分析:先对区间排序,先按右端点排,再按左端点排。有重叠的区间(仅有交点重叠也视为重叠)之间一定可以摆不出空隙来。贪心策略:每碰到一个新的区间(与前面区间没有任何重叠),则把线段放到该区间最后一个长度为1的位置,如果不是新区间则可以直接忽略。
代码如下:
# include<iostream> # include<cstdio> # include<cstring> # include<algorithm> using namespace std; struct Q { int l,r; bool operator < (const Q &a) const { if(r==a.r) return l<a.l; return r<a.r; } }; Q a[100005]; void solve(int n) { int ans=0,p=-1; for(int i=0;i<n;++i){ if(a[i].r==p) continue; if(a[i].l>p){ ++ans; p=a[i].r; }else ++p; } printf("%d\n",ans-1); } int main() { int T,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0;i<n;++i) scanf("%d%d",&a[i].l,&a[i].r); sort(a,a+n); solve(n); } return 0; }