• 540B :School Marks


    题目链接

    题意:

    输入:

    第一个: 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,
  • 相关阅读:
    军火库(第一期):无线电硬件安全大牛都用哪些利器?
    AMD64与IA64的区别
    win7安装apache或者php 5.7缺少vcruntime140.dll的问题
    DrawText
    Delphi与C语言类型转换对照
    chm文件打开空白无内容的解决办法
    在ubuntu 15.04下安装VMware Tools
    Vmware怎样使用nat和桥接方式解决虚拟机联网问题
    Ubuntu 14.04/14.10下安装VMware Workstation 11图文教程
    Ubuntu 16.04 安装 VMware-Workstation-12
  • 原文地址:https://www.cnblogs.com/bbbblog/p/4674654.html
Copyright © 2020-2023  润新知