题意:就是给一n(奇数)个元素数组,可以对它的元素执行k次+1操作,递增排序,求中位数最大是多少。

那我们在排完序之后,中位数前的元素可以不管它,只要对中位数后的操作就行,我们要判断和中位数相等的元素有几个,再用k减去它,循环一下,当k小于0时没的减了,也就是数组元素不能再加了时跳出来。

附ac代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define ma (int)2e5+1
 7 using namespace std;
 8 int main(){
 9     int n,k,a[ma];
10     cin>>n>>k;
11     for(int i=1;i<=n;i++){
12         cin>>a[i];
13     }
14     if(n==1){
15         cout<<a[1]+k;
16         return 0;
17     }
18     sort(a+1,a+1+n);
19     int i,l=0,q=(n+1)/2;
20     for(i=a[q];k>=0;i++){
21         while(i==a[q+1])q++;
22         k-=q-(1+n)/2+1;
23     }
24     cout<<i-1;
25     return 0;
26 }

因为我这k=0时还会操作,但是其实不能操作了,所以i++后我输出又要减回去;如果循环内操作完k<0,那说明之前执行i++的操作无效,所以也是i减回去,最后都输出i-1.

分类: 未分类

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注