1 条题解
-
3
题面并不复杂,观察数据范围容易发现二分答案可以通过。
实现也不复杂。
令当前期望中位数为 ,显然序列中最多只能有 个数 。对于多出来的 的数将它们都改为 ,很显然这样做代价是最小的。
如果代价 说明中位数 是无法实现的,反之可以实现。
时间复杂度
可能是,可以通过因为我过了。#include<bits/stdc++.h> using namespace std; #define int unsigned long long const int maxn=2e5+7; int a[maxn]; int n,k; bool check(int mid){ int cnt=0,sum=0; for(int i=1;i<=n;i++){ if(a[i] >= mid)break; if(a[i] < mid)cnt++; if(cnt > n/2)sum+=mid-a[i]; } return sum<=k; } signed main(){ cin>>n>>k; for(int i=1;i<=n;i++){ cin>>a[i]; } int l=1,r=1e16,ans=0; sort(a+1,a+n+1); while(l<=r){ int mid=l+(r-l)/2; if(check(mid)){ ans=mid; l=mid+1; } else r=mid-1; } cout<<ans; }
- 1
信息
- ID
- 7254
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 19
- 已通过
- 5
- 上传者