链接:https://www.nowcoder.com/acm/contest/52/M
来源:牛客网
题目描述
小杰组织了一场比赛,在比赛前需要安排队伍签到,但他不确定签到要花多久时间,现在他来请求你的帮助。已知签到是在一个体育馆,该体育馆布置有三个桌子以供不同队伍的队伍同时签到,一个桌子最多只能有一支队伍签到,一支队伍只需在一张桌子前完成签到即可。如果三个桌子都有队伍在签到,其它需要签到的队伍就需要在任意一个桌子前排队,等待签到。
我们假设在t=0的时刻开始接受签到,n支队伍分别在a1,a2,...,an时刻到达体育馆,每支队伍完成签到均需b的时间,为使问题简单,我们忽略体育馆中移动的时间。你需要告诉小杰最早什么时刻,所有的队伍均签到完成。
输入描述:
多组读入。
输入数据的第一行是一个整数T,表示数据的组数。
每组数据的第一行是一个整数n,表示签到的队伍数。
接下来一行有n个整数ai,表示第i支队抵达体育馆的时间。
每组的最后一行是一个整数b,表示一支队伍完成签到的时间。
输出描述:
对于每组数据,输出最后一支队伍最早签到完成的时刻。
示例1
输入
2
5
1 2 4 5 7
4
7
4 4 4 2 8 9 11
5
输出
11
17
备注:
1≤n≤600
0≤ai≤104
1≤b≤1500
数据不超过250组
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std ;
const int MAX = 100000 + 10 ;
typedef long long LL ;
int a[2000] ;
int main()
{
int T ;
cin >> T ;
while(T--)
{
int n ;
int b ;
cin >> n ;
for(int i = 1 ; i<= n ; i++)
{
cin >>a[i];
}
cin >> b ;
sort(a+1,a+n+1);
if(n<=3)
{
cout<<a[n]+b<<endl;
}
else
{
priority_queue<int, vector<int>, greater<int> > q;
for(int i = 1 ; i<=3 ;i++)
{
q.push(a[i]+b) ;
}
for(int i = 4 ; i<= n ;i++)
{
int x = q.top() ;
q.pop();
if(x>a[i])
{
q.push(x+b) ;
}
else
{
q.push(a[i]+b);
}
}
while(!q.empty())
{
if(q.size()==1)
{
int x = q.top() ;
cout<<x<<endl;
break;
}
else
{
q.pop();
}
}
}
}
return 0 ;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std ;
const int MAX = 100000 + 10 ;
typedef long long LL ;
int a[2000] ;
int main()
{
int T;
cin >>T;
while(T--)
{
int n ;
cin >>n ;
for(int i = 1 ;i <=n ;i++)
{
cin >>a[i] ;
}
int b ;
cin >> b ;
sort(a+1,a+1+n);
if(n<=3)
{
cout<<a[n]+b<<endl;
continue ;
}
int que[3] = {0} ;
sort(que,que+3);
for(int i = 1 ;i<= n; i++)
{
sort(que,que+3);
que[0] = max(que[0],a[i])+b;
}
sort(que,que+3);
printf("%d\n",que[2]);
}
return 0 ;
}