2018 科大讯飞笔试题

题目

     华老师的n个学生参加了一次模拟测试,考出来的分数很糟糕,但是华老师可以将分数改为[0,100]的任意值,所以他想知道,如果要使所有人的成绩平均分不少于X分,至少要改动多少人的分数。

输入:

第一行一个书T,共T组数据

接下来对于每组数据:

第一行两个整数n和X。(1<=n<=1000,0<=X<=100)

第二行n个整数,第i个数Ai表示第i个学生的成绩(0<=Ai<=100)

输出:

共T行,每行一个整数,代表最少的人数。

样例输入
2
5 60
59 20 30 90 100
5 60
59 20 10 10 100

样例输出
1
2

分析思路: 

对于第一行数据,将它作为两组数据的个数,在输入的时候作为外循环使用,然后将第二/四行的第一个整数作为一个数组的长度n,第二个整数即为平均数avg,那么sum1=n*avg;再将数组中的每个数相加sum2=array[0]+array[1]+...array[4],利用difference=sum1-sum2,再将数组中的元素和100求差,排序,difference从新数组的最后一个元素进行比较,如果大于一个元素,需要改动次数就+1,同时difference就减去新数组的元素。

代码实现:

package cn.hjt.practise;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Test {

	// 主方法:返回需要改动的数字个数
	public static int updateNumber(int avg, List list, ArrayList array2) {
		int len1 = list.size();
		int len2 = array2.size() - 1;
		int sum1 = 0;
		int sum2 = avg * len1;
		int number = 0;
		for (int i = 0; i < len1; i++) {
			sum1 += list.get(i);
		}
		int difference = sum2 - sum1;
		if (0 > difference)
			return 0;
		else {
			while (difference > 0) {
				number++;
				difference -= array2.get(len2);
				len2 -= 1;
			}
		}
		return number;
	}

	// 将输入的数组 进行求差 并排序
	public static List difference(List list) {
		List tempArray = new ArrayList<>();
		for (int i = 0; i < list.size(); i++) {
			tempArray.add(100 - list.get(i));
		}
		Collections.sort(tempArray);
		return tempArray;
	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int num = 0;
		int avg = 0;
		List list2 = new ArrayList<>();
		while (scanner.hasNext()) {
			int number = scanner.nextInt();
			List list = new ArrayList<>();
			for (int i = 0; i < number; i++) {
				num = scanner.nextInt();
				avg = scanner.nextInt();
				for (int j = 0; j < num; j++) {
					list.add(scanner.nextInt()); // 将每组数据存放到list中
				}
				ArrayList array1 = (ArrayList) difference(list); // 对list中的元素进行求差排序
				list2.add(updateNumber(avg, list, array1)); // 将需要次数放入一个集合中
				list.clear(); // 对存放组合数据的集合进行清空操作
				array1.clear(); // 对求差排序的集合同时进行清空操作
			}
			for (int i = 0; i < list2.size(); i++) {
				System.err.println(list2.get(i));;
			}
		}
		
		scanner.close();
	}
}
/*
 *2
  5 60
  59 20 30 90 100
  5 60
  59 20 10 10 100
   */

运行结果:

2
5 60
59 20 30 90 100
5 60 
59 20 10 10 100
1
2

 

 

你可能感兴趣的:(2018 科大讯飞笔试题)