标签:起点 style ++ ali clu include 活动 div namespace
题目描述
在时间轴上,有n条线段,起点为si,终点为fi,求最多选取多少条线段使其两两互不相交。不过注意这里的区间为一段闭,一段开,可直接用贪心。
思路
我们先考虑将n条线段按右端点升序序排序,若右端点相同则按左端点升序排序(其实左端点无所谓)。那么,我们只需升序查找判断当前线段能放入即可,若可以,则ans++,否则就继续循环。这个贪心策略显然是对的,因为我们如果能选择当前[si,fi),[sj,fj)(fi<fj)这两条线段,那么我们可以选择第一条线段,这样对后续状态影响最小,并且肯定可以选,这样必定会是最优情况下的方案之一。
代码
#include <bits/stdc++.h> using namespace std; struct aa { int st,ed; }a[1100]; bool cmp(aa x,aa y) { if(x.ed!=y.ed)return x.ed<y.ed; else return x.st<y.st; } int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&a[i].st,&a[i].ed); sort(a,a+n,cmp); int ans=0,k=0; for(int i=0;i<n;i++) if(a[i].st>=k) { k=a[i].ed; ans++; } printf("%d",ans); return 0; }
标签:起点 style ++ ali clu include 活动 div namespace
原文地址:https://www.cnblogs.com/fangbozhen/p/11602364.html