本以为是区间覆盖问题,如果有时间重叠的部分,就加上,虽然区间覆盖掌握的也不是很好,不知道是按照起始时间还是离开时间排序,之后会再好好复习这方面的习题
起始代码
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; struct node { int st; int et; int num; friend bool operator < (node a, node b) { return a.st<b.st; } }ma[10010]; int main() { int t,n,m; scanf("%d",&t); int a,b,c,d; while(t--) { scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d %d:%d %d:%d",&m,&a,&b,&c,&d); ma[i].st=a*60+b; ma[i].et=c*60+d; ma[i].num=m; } sort(ma,ma+n); //for(int i=0; i<n; i++) //{ // printf("%d %d %d\n",ma[i].num,ma[i].st,ma[i].et); //} int mint=ma[0].st,maxt=ma[0].et; int ans=ma[0].num; for(int i=1; i<n; i++) { if(maxt>ma[i].st) { maxt=ma[i].et; ans+=ma[i].num; } } printf("%d\n",ans); } } 后来学到了按照离开时间进行排序(也不知道为什么),还有ans的更新,但是也是错的,原来这不是区间覆盖问题,而是在连续区间覆盖的时候,第一个区间走之后的椅子可以供下一个区间和下下个区间的人使用,看了正解就自然明白了 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[1000010]; int main() { int t,n,s; int i,j; int max; int hour1,hour2,min1,min2; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a));//一开始要清零 scanf("%d",&n); max=-100;//纪录最小的座位 for(i=0;i<n;++i) { scanf("%d %d:%d %d:%d",&s,&hour1,&min1,&hour2,&min2);//s表示这个时间段来的人数 int sum1=hour1*60+min1;//每个时间都有一个sum1和sum2这个区间 int sum2=hour2*60+min2; for(j=sum1;j<sum2;++j)//当两区间有公共部分时,数组a[i]刚才也存了一个数了 { a[j]+=s; //printf("%d ",a[j]); if(a[j]>max)//当数组a纪录的座位数大于max,要把max更新 max=a[j]; } //printf("\n"); } printf("%d\n",max); } return 0; }