给一堆电视节目的起止时间,问最多能完整收看几个节目
---------------------------------------------------------------------------
用dp写的交的:
先按终止时间排序,然后dp[i]代表以i结尾最多能看几个节目,方程为:dp[i] = max{1,(dp[j]+1) [0<=j<i,i,j无冲突] }
int main(){ int n,a,b; while(scanf("%d",&n),n){ for(int i=0;i<n;i++){ scanf("%d%d",&a,&b); segs[i]=make_pair(a,b); } std::sort(segs,segs+n,cmp); int ans = 0; for(int i=0;i<n;i++){ dp[i]=1; for(int j=0;j<i;j++){ if(segs[j].second<=segs[i].first) dp[i] = MAX(dp[i],dp[j]+1); } ans = MAX(ans,dp[i]); } printf("%d ",ans); } return 0; }
----------------------明明是个贪心题:
按终止时间排序,然后依次扫描即可,最早结束的节目肯定要选,后面的节目只要不冲突就选。
#include <set> #include <map> #include <stack> #include <queue> #include <cmath> #include <vector> #include <string> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define MAX(a,b) ((a)>=(b)?(a):(b)) #define MIN(a,b) ((a)<=(b)?(a):(b)) #define OO 0x0fffffff typedef long long LL; using namespace std; typedef pair<int,int> int2; const int N = 128; int2 segs[N]; int dp[N]; bool cmp(const int2 &a,const int2 &b){ if(a.second==b.second) return a.first<b.first; return a.second<b.second; } int main(){ int n,a,b; while(scanf("%d",&n),n){ for(int i=0;i<n;i++){ scanf("%d%d",&a,&b); segs[i]=make_pair(a,b); } std::sort(segs,segs+n,cmp); int ans = 0; int last = -1; for(int i=0;i<n;i++){ if(segs[i].first>=last){ ans++; last = segs[i].second; } } printf("%d ",ans); } return 0; }