题意:
输入:
第一个: 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,
时间: 2024-10-21 10:32:59