题目链接

题意:

输入:

第一个: n k p x y

第二行:k个数

n: 数的数量

k:n个数中已经知道的k个数

p:n个数取值的上界,下界是1

x:n个数的和的上界x

y:n个数的中位数至少是 y

输出:

补充其余的n-k个数,使得这个n个数的和不大于x,中位数不小于y

解题思想:

对已经知道的k个数,判断其中大于等于y的数median有几个,

若median<=n/2 说明已知道的k个数中大于y的不到一半,则在未知道的n-k个数中,补充y,当median>n/2 时候停止

若还没有补充完n-k个数,则补充1,

根据上面得到的是满足中位数大于等于y的最小序列

下面判断这个n个数的和是否大于x

这样就ok了

Java程序:

import java.util.Scanner;


public class B540 {
    static void run0(){
         Scanner sc= new Scanner(System.in);
         int n = sc.nextInt();// n 个数
         int k = sc.nextInt();// 已经知道的 k个数
         int p = sc.nextInt();// n 个数可取的最大值p,最小值是 1
         int x = sc.nextInt(); // n 个数的和的上界
         int y = sc.nextInt(); // n 个数的中位数至少为 y
         int[] a = new int[n]; // 存放n 个数
         int median = 0;// = n/2 时候是中位数
         int i=0;
         int sum = 0; // n个数的和
         for(i=0;i<k;i++){
             a[i] = sc.nextInt();
             if(a[i]>= y) // 大于y 的个数
                 median++;
         }
         // 若median <=n/2 说明输入的数中> y 的数还不够
         while(i<n && median<= n/2){
             a[i++] = y;
             median++;
         }
         // 其他值至少是 1 
         for(;i<n;i++){
             a[i] = 1;
         }
         // 上面的值是满足中位数至少是y的 一个条件
         // 下面考虑n个数的和要小于 x
         for(int j=0;j<n;j++)
             sum += a[j];
         if(sum>x || median<= n/2){
             System.out.println(-1);
             return;
         }
         
            for(int j=k;j<n;j++)
                System.out.print(a[j]+" ");
    }
    public static void main(String[] args){
        run0();
                 
    }
}

Python程序:

n,k,p,x,y = map(int,raw_input().split())

a = map(int,raw_input().split())
median = 0
s = 0
for i in a:
    s+=i
    if i>=y:
        median +=1
b = []
while median<= n/2:
    b.append(y)
    median = median +1 
while len(b)+k < n :
    b.append(1)
if len(b)+k>n or sum(b)+s >x:
    print -1
else:
    for i in b:
        print i,