0
点赞
收藏
分享

微信扫一扫

E - Average and Median(二分)

E - Average and Median(二分)

第一问二分答案E - Average and Median(二分)_动态规划,然后可以所有数E - Average and Median(二分)_#define_02,那么就是在要求下满足E - Average and Median(二分)_时间复杂度_03

可以dp。

第二问同理,二分答案E - Average and Median(二分)_动态规划,然后E - Average and Median(二分)_时间复杂度_05

那么就是E - Average and Median(二分)_二分答案_06

也是dp。

时间复杂度:E - Average and Median(二分)_时间复杂度_07

难点就是在于一开始没想到 二分后怎么快速算。原来可以dp。

#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define inf 0x3f3f3f3f
#define mod 1000000007
#define m_p(a,b) make_pair(a, b)
#define mem(a,b) memset((a),(b),sizeof(a))
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)

typedef long long ll;
typedef pair <int,int> pii;

#define MAX 300000 + 50
int n, m, k;
int tr[MAX];
double dp[MAX][2];

bool check1(double mid){
dp[0][0] = dp[0][1] = 0.0;
for(int i = 1; i <= n; ++i){
dp[i][0] = dp[i - 1][1];
dp[i][1] = max(dp[i - 1][0], dp[i - 1][1]) + tr[i] - mid;
}
if(max(dp[n][1], dp[n][0]) >= 0)return true;
else return false;
}
bool check2(int mid){
dp[0][0] = dp[0][1] = 0;
for(int i = 1; i <= n; ++i){
dp[i][0] = dp[i - 1][1];
dp[i][1] = max(dp[i - 1][0], dp[i - 1][1]) + (tr[i] >= mid ? 1 : -1);
}
if(max(dp[n][1], dp[n][0]) > 0)return true;
else return false;
}


void work(){
cin >> n;
for(int i = 1; i <= n; ++i)cin >> tr[i];
double l = 0, r = 1000000000.0;
while (r - l >= 1e-6) {
double mid = (l + r) / 2;
if(check1(mid))l = mid;
else r = mid;
}
int ll = 0, rr = 1000000000;
while (ll <= rr) {
int mid = (ll + rr) / 2;
if(check2(mid))ll = mid + 1;
else rr = mid - 1;
}
cout << r << '\n' << rr << endl;
}

int main(){
io;
work();
return 0;
}


举报

相关推荐

0 条评论