题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1050
经典的贪心算法
有两点要注意的
第一点:按照开始的时间排序,开始的时候用结束时间来排序,结果确实不对,有些数据通不过,例如:
4
10 30
15 50
60 70
40 80
所以需要用开始的时间排序
第二点:需注意题目的意思,贴图:
仔细观察图,注意1 3 4 6这两个是不能同时进行的,这样就可以吧奇数的调整到下面的一排中,开始的时候没有注意,WR了几次
好好读题。。。
#include <iostream> #include <string> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct T{ int start,end; }a[210]; bool cmp(T a,T b){ if(a.start!=b.start) return a.start<b.start; } int main (){ int Case,temp; scanf("%d ",&Case); while(Case--){ int mark[210]={0}; int n,sum=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&a[i].start,&a[i].end); if(a[i].start>a[i].end) temp=a[i].start,a[i].start=a[i].end,a[i].end=temp; if(a[i].start%2==1) a[i].start++; if(a[i].end%2==1) a[i].end++; } sort(a,a+n,cmp); int j=n; while(n>0){ int last=-1; for(int i=0;i<j;i++) if(a[i].start>last&&mark[i]==0) mark[i]=1,n--,last=a[i].end; sum++; } printf("%d ",sum*10); } return 0; }