题目描述
新浪微博上有一个帖子给出了一道题:全班有 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 快速输入输出对象
}