-
Maximum Median
题意:给你一个数组,k次操作。操作为给某数加一,求k次操作之后最大中位数
模拟加的操作,排序之后的数组前n/2已经没啥用了,每次进行加操作的时候,模拟“填坑”,使与中位数相等的数字一步步后扩。
写的时候可以想到一部分,,,但是不会模,,感觉这种写法很巧妙所以记录一下。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e6+10;
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
#define mod 1000000007
#define lson rt<<1,l,mid
#define endll printf("\n")
#define pii pair<int, int>
#define rson rt*2+1,mid+1,r
#define stop system("pause")
#define s1(a) scanf("%d", &a)
#define lowbit(x) ((x) & (-x))
#define s2(a, b) scanf("%d %d", &a, &b)
#define mem(a, b) memset(a, b, sizeof(a))
#define s3(a, b, c) scanf("%d %d %d", &a, &b, &c)
ll n,k;
ll a[MAXN];
//填坑法
int main()
{
scanf("%lld %lld",&n,&k);
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
sort(a,a+n);
int cnt=1;
ll ans=a[n/2];
int i=n/2;
//要加多少数字(走到某数字前面肯定是相等的)cnt
//目前走到哪了i,每次添加的值即为i-n/2
while(i+1<n&&k>0)
{
ll v=min(k/cnt,a[i+1]-ans);//
ans+=v;
k-=v*cnt;
cnt++;i++;
}
if(k>0)
ans+=k/cnt;
printf("%lld\n",ans);
//stop;
return 0;
} 
京公网安备 11010502036488号