题意:(模拟)
在一个餐厅里每天会有好几波客人,给出他们来的时间和走的时间,
询问餐厅最少需要多少把椅子才能使来的客人都有椅子坐。
正确思路:
客人来的时候餐厅总人数增加(v),客人走的时候餐厅总人数增加(-v),v代表每一波来的人数
开辟一个2*n的数组(node类型),node.t保存来的时刻或走的时刻,node.v保存应该增加的人数,
对于 “来“ 的时刻node.v=v,对于“走“的时刻node.v=-v;对数组进行排序(按照时间的先后顺序),注意:对于测试
案例发现临界情况所以排序时,将同一时刻的 “离开“ 放在 “来“ 的前面
#include <cstdio> #include <cstring> #include <algorithm> #define MAX 20010 using namespace std; struct node{ int t; int v; }d[MAX]; bool cmp(node a,node b){ if(a.t==b.t) return a.v<b.v; return a.t<b.t; } int main(){ int T; scanf("%d",&T); int n; while(T--){ scanf("%d",&n); memset(d,0,sizeof(d)); int sh,sm,th,tm,v; for(int i=0;i<n;++i){ scanf("%d%d:%d%d:%d",&v,&sh,&sm,&th,&tm); d[i*2].t=sh*60+sm; d[i*2].v=v; d[i*2+1].t=th*60+tm; d[i*2+1].v=-v; } sort(d,d+2*n,cmp); int ans=0; int s=0; for(int i=0;i<2*n;++i){ s+=d[i].v; if(s>ans) ans=s; } printf("%d\n",ans); } return 0; }
错误思路:
刚开始打算对于时间段进行排序,但经过分析发现对于开始时间或结束时间排序都无法解决这道题(收获:学会切分的思想);
然后又思考区间重叠,还是无法解决,最终暴力解决,枚举0-24,对于每个时间段:1440*10000.显然超时
附上超时代码:
#include <cstdio> #include <cstring> #define MAX 10010 using namespace std; struct node{ int cn; int sth; int stm; int eth; int etm; int st; int et; }e[MAX]; int ans[24][60]; int n; int main() { int T; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=0;i<n;++i){ scanf("%d%d:%d%d:%d",&e[i].cn,&e[i].sth,&e[i].stm,&e[i].eth,&e[i].etm); e[i].st=e[i].sth*60+e[i].stm; e[i].et=e[i].eth*60+e[i].etm; } memset(ans,0,sizeof(ans)); for(int i=0;i<24;++i){ for(int j=0;j<60;++j){ for(int k=0;k<n;++k){ int tmp=i*60+j; if(tmp>=e[k].st&&tmp<e[k].et) ans[i][j]+=e[k].cn; } } } int bestans=0; for(int i=0;i<24;++i) for(int j=0;j<60;++j) if(ans[i][j]>bestans) bestans=ans[i][j]; printf("%d\n",bestans); } return 0; }
收获:1、模型变换(切分思想)
2、超时体验
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-07 20:36:57