【Java算法】团体程序设计天梯赛L1-100 四项全能

题目描述

新浪微博上有一个帖子给出了一道题:全班有 50 人,有 30 人会游泳,有 35 人会篮球,有 42 人会唱歌,有 46 人会骑车,至少有( )人四项都会。


发帖人不会做这道题,但是回帖有会做的:每一个才艺是一个技能点,一共是 30 + 35 + 42 + 46 = 153 个技能点,50 个人假设平均分配,每人都会 3 个技能那也只有 150,所以至少有 3 人会四个技能。
本题就请你写个程序来自动解决这类问题:给定全班总人数为 n,其中有 m 项技能,分别有 k1​、k2​、……、km​ 个人会,问至少有多少人 m 项都会。

输入格式:

输入在第一行中给出 2 个正整数:n(4≤n≤1000)和 m(1<m≤n/2),分别对应全班人数和技能总数。随后一行给出 m 个不超过 n 的正整数,其中第 i 个整数对应会第 i 项技能的人数。

输出格式:

输出至少有多少人 m 项都会。

输入样例:

50 4
30 35 42 46

输出样例:

3

代码长度限制                                                                                                                     16 KB

时间限制                                                                                                                            400 ms

内存限制                                                                                                                            64 MB

栈限制                                                                                                                                8192 KB

解题思路

按题意,班级上总共n个人,m项技能,令sum=所有人的技能点,假设平均分配(m-1)个技能的技能点数给全班n个人,还剩下最后一个技能的技能点,也就是说,这最后的一个技能分给谁,谁就会m个技能。

可以想出,至少m 项技能都会的人x = sum - n * (m-1)

注意事项

当sum<n*(m-1)时,全班人的总和技能点不足以分给班内的每个人,x<0,这时要注意判断x<0的情况,当x<0时输出0

实现代码

package test;

import java.io.*;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws Exception {
        int n = readInt();
        int m = readInt();
        int sum = 0;
        for (int i = 0; i < m; i++) {
            sum += readInt();
        }
        int x = sum - n * (m - 1);
        if (x <= 0) {
            System.out.println("0");
        } else {
            System.out.println(x);
        }
    }

    // region 设置系统输入流为stdin.txt文件,输出流为stdout.txt
    static {
//        try {
//            System.setIn(new FileInputStream("stdin.txt"));
//            System.setOut(new PrintStream("stdout.txt"));
//        } catch (FileNotFoundException e) {
//            throw new RuntimeException(e);
//        }

    }
    // endregion 设置系统输入流为stdin.txt,输出流为stdout.txt
    // region 快速输入输出对象
    /**
     * 输入流
     */
    public static final Scanner sc = new Scanner(System.in);
    public static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static final StreamTokenizer st = new StreamTokenizer(br);
    public static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    private static int readInt() {
        try {
            st.nextToken();
            return (int) st.nval;
        } catch (Exception ignored) {

        }
        return -1;
    }

    private static double readDouble() {
        try {
            st.nextToken();
            return st.nval;
        } catch (Exception ignored) {

        }
        return -1;
    }

    private static String readString() {
        try {
            st.nextToken();
            return st.sval;
        } catch (Exception ignored) {

        }
        return "";
    }

    /**
     * 配置st读取数字字符串
     */
    private static void parseLongNumber() {
        st.ordinaryChars('0', '9');
        st.wordChars('0', '9');
    }

    private static long readLong() {
        try {
            st.nextToken();
            return Long.parseLong(st.sval);
        } catch (Exception ignored) {

        }
        return -1;
    }
    // endregion end 快速输入输出对象
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值