首页 > 其他分享 >Codeforces Round 895 (Div. 3) B. The Corridor or There and Back Again

Codeforces Round 895 (Div. 3) B. The Corridor or There and Back Again

时间:2023-10-16 20:13:56浏览次数:39  
标签:std Again 895 int ed There long 坐标 陷阱

你在一个向右延申的无限坐标轴上,且你初始在坐标 \(1\) 。有 \(n\) 个陷阱在坐标轴上,第 \(i\) 个陷阱坐标为 \(d_i\) ,且会在你踩上这个陷阱的 \(s_i\) 秒过后发动。这时候你不能进入坐标 \(d_i\) 或者走出坐标 \(d_i\) 。

你需要确定最远的 \(k\) ,保证你能够走到坐标 \(k\) ,并且顺利返回坐标 \(1\) 。

两个思维:

一:不难想到 \(k\) 可以二分,只需要检查返回途中是否遇到阻碍即可。回程路上经过第 \(i\) 个陷阱时的时间为 \(t_i = (k - 1) + (k - d_i)\) ,第 \(i\) 个陷阱启动的时间为 \(ed_i = d_i - 1 + s_i\) 。保证 \(t_i < ed_i\) 即可。

view1
#include <bits/stdc++.h>
typedef long long ll;
void solve(){
	int n; std::cin >> n;
	std::vector<int> d(n+1), s(n+1);
	for (int i = 1; i <= n; i++) {
		std::cin >> d[i] >> s[i];
	}
	int L = 0 - 1, R = 300 + 1; // 最远可走 200 + 100
	auto check = [&](int x) {
		int ok = 1;
		for (int i = 1; i <= n; i++) {
			if (d[i] > x) continue; // 没触发的陷阱不用计算
			int t = (x - 1) + (x - d[i]), ed = (d[i] - 1 + s[i]);
			ok &= (t < ed);
		}
		return ok;
	};
	while ( R - L > 1 ) {
		int M = ( R + L ) >> 1;
		if ( check(M) )
			L = M; // L
		else
			R = M;
	}
	std::cout << L << '\n';
}
int main() {
	int _ = 1; std::cin >> _;
	while (_--) {solve();}
	return 0;
}

二:进一步思考发现,是否真的需要二分?
\(n\) 个陷阱对应了 \(n\) 个约束条件。
若触发第 \(i\) 个陷阱,则只需在 \(s_i - 1\) 秒内回到 \(d_i\), 即可以走到的最远距离为 \(l_i = d_i + \lfloor \frac{s_i - 1}{2} \rfloor\) 。最终答案为 \(min_{i = 1}^{n} l_i\) 。

view2
#include <bits/stdc++.h>
typedef long long ll;
void solve(){
	int n; std::cin >> n;
	std::vector<int> d(n+1), s(n+1);
	int ans = 1 << 30;
	for (int i = 1; i <= n; i++) {
		std::cin >> d[i] >> s[i];
		ans = std::min(ans, d[i] + (s[i] - 1) / 2);
	}
	std::cout << ans << '\n';
}
int main() {
	int _ = 1; std::cin >> _;
	while (_--) {solve();}
	return 0;
}

标签:std,Again,895,int,ed,There,long,坐标,陷阱
From: https://www.cnblogs.com/zsxuan/p/17768091.html

相关文章

  • CF1872B The Corridor or There and Back Again
    CF1872BTheCorridororThereandBackAgain观察第二组样例的解释,注意这句话:“第二个陷阱限制了你”。这启发我们计算经过每个陷阱之后最多还能向前走到哪里,然后取\(\min\)得到答案。现在的问题是如何求出每个陷阱限制的最远可到达点。由于要求折返,因此对于第\(i\)个......
  • The build restored NuGet packages. Build the project again to include these pack
    ThebuildrestoredNuGetpackages.Buildtheprojectagaintoincludethesepackagesinthebuild 在VisualStudio2022中构建代码时出现此错误。严重性代码说明项目文件行禁止显示状态错误ThebuildrestoredNuGetpackages.Buildtheprojectagainto......
  • 【线段树合并】CF1805E There Should Be a Lot of Maximums 题解
    CF1805E待补:有另解看到维护树上问题,可以想到线段树合并。但直接维护显然不行,要一点技巧。发现\(val\)的出现次数\(cnt_{val}\)如果\(\ge3\),那么一定是一个候选项,若\(cnt_{val}=1\),那么一定不能作为候选项。于是可以用权值线段树维护对于\(val\)有\(cnt_{val}=......
  • go-ethereum mint nft用户支付实现
    代码:packagemain//签名用的公钥私钥也是采用的owner的公钥私钥import( "context" "fmt" "math/big" "user-pay/triplec" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil&qu......
  • go-ethereum设置signer
    设置代码:packagemain//签名用的公钥私钥也是采用的owner的公钥私钥import( "fmt" "set_signer/triplec" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethc......
  • Codeforces Round 895 (Div. 3)
    A题简单的模拟计算,注意上取整的实现。B题计算每个房间对应的每个最迟时间点,在这些时间点最取最小值,保证能安全通过所有房间。D题拿到手就可以发现是贪心,但发现两部分会有冲突,也就是重复计算的部分。故提前找到两个数的lcm然后不计算lcm的倍数,为其他参与计算的数安排剩余数种的最......
  • 「题解」Codeforces Round 895 (Div. 3)
    A.TwoVesselsProblem题目Sol&Code签到题#include<bits/stdc++.h>typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}intT,a,b,c;intmain(){scanf("%d"......
  • Virtual memory running out when there are free physical memory?
    Virtualmemoryrunningoutwhentherearefreephysicalmemory?AskQuestionAsked 7years,8monthsagoModified 7years,8monthsagoViewed 1ktimes  1Myfirefoxsuddenlybecomesluggishandthenfroze.IopenedProcessExplore......
  • E---句子中的there 与 here
    译文:CallstodisassemblealltelescopesonMaunaKeaortobanfuturedevelopmentthere ignoretherealitythatastronomyandHawaiianculturebothseektoanswerbigquestionsaboutwhoweare,wherewecomefromandwherewearegoing.翻译:拆除莫纳克亚......
  • P2895
    本题用时:01:44:20.算法:BFS期间固然去逛了逛淘宝买了两个东西,但毕竟还是太久了。我因为忘记判断是否出界而浪费了好多时间,后来才半天想起来,这便是用了这么长时间的原因。之后提交代码只有六十多分,剩下的点TLE了,我马上反应过来是没判重,赶紧加了个判重。在这里,我没加判重是失误,但......