中位數最大問題


問題:

Description
Glory 是xd著名的 Sugar Daddy,他會給他的粉絲發糖,他現在有 n 個粉
, 每個粉絲手里有一定的數量的糖果,現在 Glory 又想給他們再發一些糖,一
m 顆,並希望發完糖之后所有粉絲擁有的糖果數量的中位數盡可能地大,所
以他想問你再給某些人發一些糖之后,中位數最多能提高到多少。
Input
多組數據,每一組數據第一行兩個正整數 n,m, 0 < n 100000; 0 < m < 106
接下來一行包含 n 個數,每個數 0 ai 100000 表示標號為 i 的粉絲手里
目前的糖果數量
為了方便計算,所有給出的 n 都將會是奇數。
Output
對於每一組數據,輸出一行包含一個數,表示粉絲擁有糖果數量的中位數在
Glory 再次發糖后最高能是多少。

對於給出的這n個數,我們首先應該對這n個數進行從小到大的排序。然后,假設我們能夠將中位數最大增加到x。所有比中位數小的數,也就是前n/2個數,都是沒有用的。要把中位數增加到x,我們就要把所有比中位數大的數,但是比x小的數的值增加到x。我們通過二分查找,找到第一個大於等於x的數,所有要增加的數,就是k∈[n/2,t)中的所有數,一共有t-n/2個。將這些數字增加到x所需要的糖果的數量是:

 

 

S是預先計算的前綴和:

C源碼:

 1 #include<stdio.h>
 2 int binaryFind(int a[],int low,int high,int target){
 3     int mid=(low+high)/2;
 4     if(a[mid]>=target && a[mid-1]<target){
 5         return mid;
 6     }else if(a[mid]>target){
 7         high=mid-1;
 8         return binaryFind(a,low,high,target);
 9     }else{
10         low=mid+1;
11         return binaryFind(a,low,high,target);
12     }
13     if(low>high)
14         return -1;
15 }
16 void computePreSum(int a[],int length,int sum[]){
17     for(int i=0;i<length;i++){
18         for(int j=0;j<=i;j++){
19             sum[i]=a[j]+sum[i]; 
20         }
21     }
22     
23 }
24 int needNum(int x,int sum[],int n,int t){
25     //返回將中位數增加到x,所需要的糖果數
26     int r=(t-n/2+1)*x-(sum[t]-sum[n/2-1]) ;
27     return r;
28 } 
29 int main(){
30     int a[7]={1,2,3,4,6,7,8};
31     //int result=binaryFind(a,0,5,5);
32     int n=7;
33     int sum[5]={0};
34     int m=3;//糖果的總數 
35     int result;
36     computePreSum(a,7,sum);//計算數組a的前綴和,存儲在sum數組中 
37     int midNum=a[n/2];
38     int x=midNum;
39     result=binaryFind(a,0,6,x);
40     while(needNum(x,sum,n,result)<=m){
41         x++;
42         result=binaryFind(a,0,6,x);
43     }
44     printf("%d",x-1);
45     
46     
47     /*for(int i=0;i<5;i++){
48         printf("%d ",sum[i]);
49     }*/
50 //    printf("%d",result);
51 }

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM