贪心
贪心就是指根据眼前最优解求全局最优解,没有固定公式,毕竟不是深搜那样的固定算法
对于每道题的贪心策略并不一样,需要现推
例题:
活动安排
设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。选择出由相互兼容的活动组成的最大集合。
思路:
看到题目就先排序,然而要根据后端点排序,然后再按前端点遍历,这样可以保证活动最多,正确性交由读者证明
代码:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n; struct tim{ int s,e; }a[1005]; bool cmp(tim x,tim y){ return x.e<y.e; } int tot; int now; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].s,&a[i].e); sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++){ if(a[i].s>=now){ tot++; now=a[i].e; } } printf("%d",tot); return 0; }