Codeforces Round #763 (Div. 2) Editorial C 解题报告
Posted skywalker767
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #763 (Div. 2) Editorial C 解题报告相关的知识,希望对你有一定的参考价值。
链接 :https://codeforces.com/contest/1623/problem/C
题解: 二分答案即可。比较困扰我的是两个问题:1.怎么求出 d d d。2.如何判断这个 m i d mid mid的值是否合法。会不会出现,满足check,但是实际上不存在 m i d mid mid的情况。
第一个:
i
n
t
d
=
m
i
n
(
h
[
i
]
,
c
u
r
h
[
i
]
−
x
)
/
3
;
int d = min(h[i], cur_h[i] - x) / 3;
intd=min(h[i],curh[i]−x)/3;
被题解的这个
m
i
n
min
min折服了,我想的有点复杂的东西,居然可以这样搞。
第二个问题很容易解决,如果不存在,那么要么大,要么小,如果小的话,肯定能二分出更小的地方,如果更大,同理。
#include <bits/stdc++.h>
#define int long long
#define forn(i, n) for (int i = 0; i < n; ++i)
using namespace std;
typedef pair<int , int> PII;
int n;
vector<int> vec;
bool check(int mid)
vector<int> backup(vec.begin() , vec.end());
for (int i = n - 1;i >= 2;i -- )
if (backup[i] < mid) return false;
int d = min(backup[i] - mid , vec[i]) / 3;
backup[i - 1] += d;
backup[i - 2] += d * 2;
return backup[0] >= mid && backup[1] >= mid;
signed main()
int T; cin >> T;
while(T --)
cin >> n;
vec.resize(n);
forn(i , n) cin >> vec[i];
int l = 0 , r = 1e9;
while(l < r)
int mid = (l + r + 1) >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
cout << l << endl;
return 0;
以上是关于Codeforces Round #763 (Div. 2) Editorial C 解题报告的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #763 (Div. 2) Editorial C 解题报告
Codeforces Round #763 (Div. 2) D(推式子+概率)
Codeforces Round #394 (Div. 2)