本以为是区间覆盖问题,如果有时间重叠的部分,就加上,虽然区间覆盖掌握的也不是很好,不知道是按照起始时间还是离开时间排序,之后会再好好复习这方面的习题
起始代码
#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;
}