【问题描述】
小明要组织一台晚会,总共准备了 n 个节目。然后晚会的时间有限,他只能最终选择其中的 m 个节目。
这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。
小明发现,观众对于晚上的喜欢程度与前几个节目的好看程度有非常大的关系,他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推。
小明给每个节目定义了一个好看值,请你帮助小明选择出 m 个节目,满足他的要求。
【输入格式】
输入的第一行包含两个整数 n, m ,表示节目的数量和要选择的数量。
第二行包含 n 个整数,依次为每个节目的好看值。
【输出格式】
输出一行包含 m 个整数,为选出的节目的好看值。
【样例输入】
5 3
3 1 2 5 4
【样例输出】
3 5 4
【样例说明】
选择了第1, 4, 5个节目。
【评测用例规模与约定】
对于 30% 的评测用例,1 <= n <= 20;
对于 60% 的评测用例,1 <= n <= 100;
对于所有评测用例,1 <= n <= 100000,0 <= 节目的好看值 <= 100000。
解析:
首先要找到题中真正要表达的意思:有n个排好顺序的节目,每个节目都有不同的好看度,由于时间不足的关系,只能选择其中m个较为好看的节目,而且这些节目的顺序还是要按照之前排列的顺序。找到最终排列好顺序的这些节目的好看度并把它们输出到控制台上。
我的方法是定义3个int类型的数组,arr1、arr11、arr2,这三个数组分别存储按照节目排列顺序后的节目的好看度,按照好看度排序的好看度以及最终要使用的节目的好看度。比较arr1和arr11找到好看度排在前m的节目,赋值给arr2;再根据arr2的值在arr1中寻找该节目的好感度。
这篇博客中有我对蓝桥杯输入格式的个人写法:
蓝桥杯输入格式
~~~~以下与该题无关只是作者有感而发
个人感觉这道题很贴近生活,在看到这个题的时候首先想到的就是我院今年的元旦晚会的节目,因为在院里学生会工作的缘故,负责筹备元旦晚会,用了将近一个月的时间,而且由于疫情的原因,我们的期末考试提前了一周时间,本来用来复习的复习周变成了考试周。我的专业也是比较离谱平常课也比较多,再加上筹备元旦晚会,时间不是很够用,不过还好期末考试没有挂科。当时筹备了好久,时间也都算好了,但是真正开始表演的时候,时间还是不够用,中间总负责人先后划掉2、3个比较不重要的节目,还是差点超时。
代码:
import java.util.Scanner;
/*【问题描述】
* 小明要组织一台晚会,总共准备了 n 个节目。
* 然后晚会的时间有限,他只能最终选择其中的 m 个节目。
* 这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。
* 小明发现,观众对于晚上的喜欢程度与前几个节目的好看程度有非常大的关系,
* 他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推。
* 小明给每个节目定义了一个好看值,请你帮助小明选择出 m 个节目,满足他的要求。
*【输入格式】
* 输入的第一行包含两个整数 n, m ,表示节目的数量和要选择的数量。
* 第二行包含 n 个整数,依次为每个节目的好看值。
*【输出格式】输出一行包含 m 个整数,为选出的节目的好看值。
*【样例输入】
* 5 3
* 3 1 2 5 4
*【样例输出】3 5 4
*【样例说明】<br>选择了第1, 4, 5个节目
* */
public class Text01 {
public static void main(String[] args) {
int[] arr1 = new int [new Scanner(System.in).nextInt()];
int[] arr11 = new int [arr1.length];
int[] arr2 = new int [new Scanner(System.in).nextInt()];
for(int i=0; i<arr1.length; i++) {
arr1[i] = new Scanner(System.in).nextInt();
arr11[i] = arr1[i];
}
//arr11是将arr1进行冒泡排序后的值
for(int i=0; i<arr11.length; i++) {
for(int j=1; j<arr11.length-i; j++) {
if(arr11[j]>arr11[j-1]) {
int temp = arr11[j];
arr11[j] = arr11[j-1];
arr11[j-1] = temp;
}
}
}
//将节目的好看度进行排序
maopao(arr11);
//找到好看度在前m个的节目
int temp = 0;
while (arr2[arr2.length-1]==0 && temp<arr2.length) {
for(int i=0; i<arr1.length; i++) {
if(arr1[i]==arr11[arr1.length-temp-1] && temp<arr2.length) {
arr2[temp] = i;
temp++;
}
}
}
//这里进行冒泡排序后是节目的顺序
maopao(arr2);
//将节目的好看度赋给数组arr2
for(int i=0; i<arr2.length; i++) {
arr2[i] = arr1[arr2[i]];
System.out.print(arr2[i]+" ");
}
}
public static int[] maopao(int[] arr){
for(int i=0; i<arr.length; i++) {
for(int j=1; j<arr.length-i; j++) {
if(arr[j]<arr[j-1]) {
int temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
return arr;
}
}