CF1872B The Corridor or There and Back Again
思路
假设第 \(0\) 时刻走进有陷阱的房间,那么必须在第 \(t_i\) 时刻前返回到这个房间之前,因为出去还需要回来,假设到达这个房间后的第 \(k\) 个房间,那么到达需要 \(k\) 的时间,回来需要 \(k+1\) 的时间,因为陷阱会困住当前在房间里的人,所以我们需要提前回去。
那么如果走到一个有陷阱的房间,假设房间在 \(a\),陷阱时间是 \(t\),那么这个陷阱就会把答案缩减到 \(a+\lfloor \frac {k-1} 2 \rfloor\)。
那么我们就直接遍历一遍,不断更新最远的答案,直到遍历到最远的答案为止。
AC code
#include<bits/stdc++.h>
using namespace std;
int T,n,t[1005],a,b,maxn;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n),memset(t,0,sizeof(t)),maxn=1000;
for(int i=1;i<=n;++i) scanf("%d%d",&a,&b),t[a]=(!t[a])?b:min(t[a],b);
for(int i=1;i<=1000;++i)
{
if(i>=maxn) break;
if(t[i]) maxn=min(maxn,i+(t[i]-1)/2);
}
printf("%d\n",maxn);
}
}