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