简单题,当时竟然没有敲出来╮(╯▽╰)╭。。。
方法:每个时间点排序从小到大排序,之后扫一遍即可:是进的时间点就加人,反之出人。更新最大值即可。。。。囧。。。
#include<iostream> #include<cstring> #include<queue> #include<cmath> #include<string> #include<algorithm> #include<cstdio> using namespace std; struct times { bool io; int num; int time; }; bool my(times a,times b) { if(a.time!=b.time)return a.time<b.time; return a.io<b.io; } int main() { int T; cin>>T; int n; while(T--) { scanf("%d",&n); vector<times>v(2*n); int sum=0; int s11,s12,s21,s22;int x; int max=0; for(int i=0;i<n;i++) { scanf("%d %d:%d %d:%d",&x,&s11,&s12,&s21,&s22); v[i+n].num=v[i].num=x; v[i+n].io=0; v[i].io=1; v[i].time=s11*60+s12; v[i+n].time=s21*60+s22; } sort(v.begin(),v.end(),my); for(int i=0;i<2*n;i++) { if(v[i].io==1) { sum+=v[i].num; if(sum>max)max=sum; } else sum-=v[i].num; } printf("%d ",max); } return 0; }