• 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;
}