晚会节目单

【问题描述】
小明要组织一台晚会,总共准备了 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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值