早教吧 育儿知识 作业答案 考试题库 百科 知识分享

招聘会人数c++题目招聘会人数来源元培-FromWHF描述某招聘机构举办招聘活动,事先不知道参会的确切人数。为了今后类似的招聘活动选择适当大小的场馆,招聘机构拟对每位参会人的进

题目详情
招聘会人数c++题目
招聘会人数

来源 元培-From WHF
描述
某招聘机构举办招聘活动,事先不知道参会的确切人数。为了今后类似的招聘活动选择适当大小的场馆,招聘机构拟对每位参会人的进出场馆时间进行记录。设第i个人进入会场的时间和离开会场的时间分别是xi, yi,那么,这个人在招聘会场的时间段t满足 xi <= t < yi。为简便起见,进出时间点用整数表示,且满足 0 <= xi < yi<1000。请统计,在这一天的招聘活动中,参会的总人数有多少;高峰时,最多有多少人同时在场。

关于输入
数据包括2行,这2行的数据个数相同:
第1行表示第i个人的到达时间xi,数之间用逗号间隔;
后1行表示第i个人的对应的离开时间yi,数之间也用逗号间隔。
例如:
2,5,4,6,7,3,1,6,2
5,6,7,7,8,4,3,9,4
表示有9个人,进出场的时间分别是:
[2,5),[5,6),[4,7),[6,7),[7,8),[3,4),[1,3),[6,9),[2,4)

关于输出
参加会议的总人数以及最多有多少人同时在场,两者之间以空格间隔。
上面例子中,参加会议的总人数为9人,最多的时候有3人同时在场。如,时间段:[2,5),[1,3),[2,4)

例子输入
2,5,4,6,7,3,1,6,2
5,6,7,7,8,4,3,9,4

例子输出
9 3

提示
总人数不超过1000人。
▼优质解答
答案和解析
#include
using namespace std;
int main()
{ const int maxn=1001;
int sum,ans,i,x,end,t[maxn]={};//t[i]表示时间i的人数流动情况,有人进来就加1,出去就减1,={}是为了把其初值全赋为0

cin>>x;i=1;
t[x]++;
while(scanf(",%d",&x)>0) {t[x]++;i++;}
cout< cin>>x;
t[x]--;
end=x;//招聘会结束时间
while(scanf(",%d",&x)>0)
{ t[x]--;
if(x>end) end=x;
}

ans=sum=t[0];
for(i=1;i { sum+=t[i];//sum=t[0]+...+t[i]表示到时间i时场内的人数
if(sum>ans) ans=sum;
}

cout<}
这道题的时间范围不是很大,因此可以像上面直接开数组t[i]。
更好的算法是读入进场时间a[]和出场时间b[]两个数组,再分别排好序,即(以题目数据为例)
1 2 2 3 4 5 6 6 7
3 4 4 5 6 7 7 8 9
不妨设第i个人在a[i]时进场,在b[i]时离场,虽然这已与题目中数据每个人对应的进出场时间不同。
接下来
ans=0;
i=s=0;
for(j=0;j{ while(a[i] if(i-s>ans) ans=i-s;
s++;//因为接下要看时间b[j+1]-1时的人数,则b[j]代表的这个人离场
}