이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define pb push_back
#define F first
#define S second
#define mk make_pair
#define mt make_tuple
using namespace std;
const int Max = 2e6 + 10 , INF = 1e9 + 10;
int n , t;
int A[Max];
long double dp[Max]; int last[Max] , cnt[Max];
void CALC(long double tst)
{
last[0] = INF;
for(int i = 1 ; i <= n ; i++)
{
dp[i] = dp[i - 1] + tst + int(A[i] <= t);
cnt[i] = cnt[i - 1] + 1;
last[i] = A[i];
if(dp[i] > dp[i - 1] + int(min(last[i - 1] + 1 , A[i]) <= t))
{
dp[i] = dp[i - 1] + int(min(last[i - 1] + 1 , A[i]) <= t);
cnt[i] = cnt[i - 1];
last[i] = min(last[i - 1] + 1 , A[i]);
}
}
}
int main()
{
ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0);
int d; cin >> n >> d >> t;
for(int i = 1 ; i <= n ; i++) cin >> A[i];
long double l = 1e9 , r = -1e9;
for(int lg = 0 ; lg < 100 ; lg++)
{
long double md = (l + r) / 2;
CALC(md);
if(cnt[n] >= d) r = md;
else l = md;
}
CALC(r);
assert(cnt[n] == d);
cout << round(dp[n] - r * cnt[n]);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |