CF1872B The Corridor or There and Back Again

发布时间 2023-09-08 08:22:42作者: One_JuRuo

思路

假设第 \(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);
	}
}