C

来源:互联网 发布:男鞋 知乎 编辑:程序博客网 时间:2024/05/20 09:09

题目链接

思路;

该题的思路,类似于区间求差问题,将每个组的用餐时间转化为一个区间,全部都放在一个数轴上,维护一个座位的值,标记区间左右端点,遇见左区间+座位遇到右区间-座位,维护最优解即可.

wa了无数发。。。。才想起这种做法。。。。

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxm=1e4+10;const int maxn=2222;struct node{int num;int time;int flag;}q[2*maxm];int cmp(node a,node b){if(a.time!=b.time)return a.time<b.time;return a.flag>b.flag;}int n;int change(char * z){int ans=0,ans2=0;int flag=0;int len=strlen(z);for(int i=0;i<len;i++){if(z[i]==':')flag=1;if(flag==1&&z[i]!=':'){ans2=ans2*10+z[i]-'0';}if(flag==0){ans=ans*10+z[i]-'0';}}return ans*60+ans2;}int main(){int t;scanf("%d",&t);while(t--){scanf("%d",&n);char s[111];for(int i=1;i<=2*n;i+=2){scanf("%d",&q[i].num);//ss=max(ss,q[i].num);scanf("%s",s);q[i].time=change(s);q[i].flag=1;scanf("%s",s);q[i+1].num=q[i].num;q[i+1].time=change(s);q[i+1].flag=2;}sort(q+1,q+1+2*n,cmp);int ss=0;int ans=0;for(int i=1;i<=2*n;i++){if(q[i].flag==1){ss+=q[i].num;}elsess-=q[i].num;ans=max(ss,ans);}printf("%d\n",ans);}return 0;}


原创粉丝点击