会场安排问题(+排序小结)

会场安排问题(最后有排序小结)

时间限制:3000 ms  |  内存限制:65535 KB
难度:3

描述

    学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。

输入

    第一行是一个整型数m(m<100)表示共有m组测试数据。
    每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。
    随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)

输出

    对于每一组输入,输出最多能够安排的活动数量。
    每组的输出占一行

样例输入

    2
    2
    1 10
    10 11
    3
    1 10
    10 11
    11 20

样例输出

    1
    2

提示

注意:如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始

思路

采用贪心的思想(该方法并不是从整体最优方面来考虑问题,而是从某种意义上的局部最优角度做出选择;选择的过程中,可以依赖之前的操作,但是不影响将来所做的选择)。

每次选取会议时都选择使得剩下时间最长的会议,这样可以保证会议数最多。也就是按结束时间从早到晚排序。


import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Plan {

	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		
		int t = cin.nextInt();
		while(t > 0) {
			t--;
			int n = cin.nextInt();
			Demo[] d = new Demo[n+5];
			for(int i=0; i<n; i++) {
				int s = cin.nextInt();
				int e = cin.nextInt();
				d[i] = new Demo(s, e);
			}
			Comparator<Demo> cmp = new Comparator<Demo>() {
				@Override
				public int compare(Demo o1, Demo o2) {
					if(o1.e == o2.e) {
						if(o1.s == o2.s) 
							return 0;
						if(o1.s > o2.s)
							return 1;
						return -1;
					}else {
						if(o1.e > o2.e)
							return 1;
						return -1;
					}
				}
			};
			Arrays.sort(d, 0, n, cmp);
			
			int cnt = 1;
			int end = d[0].e;
			for(int i=1; i<n; i++) {
				if(d[i].s > end) {
					end = d[i].e;
					cnt ++;
				}
			}
			System.out.println(cnt);
		}
	}
	
	static class Demo {
		int s,e;
		public Demo(int s, int e) {
			this.s = s;
			this.e = e;
		}
	}
}

对于自定义类排序

类内排序采用实现 Comparable 接口的方式(重写 compareTo 方法)

规则:

与本(或第一个)对象相比,若本(或第一个)对象大于另一个对象则返回1,小于则返回-1,相等则返回0;

按此规则排序是升序排序,调换返回值则反向排序。当返回0时按原相对位置排序

import java.util.Arrays;
public class Solution {
    static class P implements Comparable<P>{
    	int n1;
    	int n2;
    	public P(int n1,int n2) {
    		this.n1 = n1;
    		this.n2 = n2;
    	}
    	
    	@Override
    	public int compareTo(P p) {//按 n1 升序、n2 降序排序
    		if(this.n1 == p.n1) {
    			if(this.n2 > p.n2)
    				return -1;
    			if(this.n2 < p.n2)
    				return 1;
    			return 0;
    		}else {
    			if(this.n1 > p.n1)
    				return 1;
    			return -1;
    		}
    	}
    	
    	@Override
    	public String toString() {
    		return this.n1+"  "+this.n2;
    	}
    }
	
    public static void main(String[] args) {
		P[] p = new P[45];
		p[0] = new P(1, 6);
		p[1] = new P(4, 5);
		p[2] = new P(7, 1);
		p[3] = new P(2, 4);
		p[4] = new P(4, 6);
		p[5] = new P(7, 2);
		p[6] = new P(1, 6);
		
		Arrays.sort(p, 0, 7);
		for(int i=0; i<7; i++) {
			System.out.println(p[i]);
		}
		/*
		 * 排序结果:
		 	1  6
			1  6
			2  4
			4  6
			4  5
			7  2
			7  1
		 
		*/
	}
}

类外排序采用定义 Comparator 类型的对象(重写 compare 方法);

import java.util.Arrays;
import java.util.Comparator;
public class Solution {

    static class P {
    	int n1;
    	int n2;
    	public P(int n1,int n2) {
    		this.n1 = n1;
    		this.n2 = n2;
    	}
    	
    	@Override
    	public String toString() {
    		return this.n1+"  "+this.n2;
    	}
    }
	
    public static void main(String[] args) {
    	        P[] p = new P[45];
		p[0] = new P(1, 6);
		p[1] = new P(4, 5);
		p[2] = new P(7, 1);
		p[3] = new P(2, 4);
		p[4] = new P(4, 6);
		p[5] = new P(7, 2);
		p[6] = new P(1, 6);
		
		Comparator<P> cmp = new Comparator<P>() {
			@Override
			public int compare(P p1, P p2) {//按 n1 升序、n2 降序排序
				if(p1.n1 == p2.n1) {
	    			if(p1.n2 > p2.n2)
	    				return -1;
	    			if(p1.n2 < p2.n2)
	    				return 1;
	    			return 0;
	    		}else {
	    			if(p1.n1 > p2.n1)
	    				return 1;
	    			return -1;
	    		}
			}
		};
		
		Arrays.sort(p, 0, 7, cmp);
		for(int i=0; i<7; i++) {
			System.out.println(p[i]);
		}
		/*
		 * 排序结果:
		 	1  6
			1  6
			2  4
			4  6
			4  5
			7  2
			7  1
		 
		*/
	}
}

如有错误或不合理的地方,敬请指正~

加油!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 小刘需要仔细查看每个活动的时间表,将时间不冲突的活动安排在同一时间段内,以便能够安排更多的活动。如果有多个活动在同一时间段内,小刘需要根据活动的重要性、参与人数等因素来进行优先安排。同时,小刘还需要考虑礼堂的容量和设备等因素,确保每个活动都能够得到充分的支持和保障。最终,小刘需要制定一个详细的活动安排表,以便学校师生能够清楚地了解每个活动的时间和地点。 ### 回答2: 小刘需要根据已有的时间表,仔细分析每个活动的重要性、时长等因素,合理地安排时间,让尽可能多的活动得到举办。具体来说,可以采取以下措施: 1. 制定优先级顺序。小刘可以将所有活动按照重要性、时长和参与人数等因素来排序,然后根据优先级来一一安排,保证优先级高的活动能够得到举办。 2. 确定时间表空隙。小刘可以先将已经确定的活动的时间表排好,然后仔细查看时间表,找出其中出现空隙的时间段,这些水突出的时间段可以重新安排其他未确定的活动,让尽可能多的活动得到举办。 3. 考虑共用场地。如果有几个活动的场地相同,小刘可以尝试将这些活动安排在同一时间段,这样可以省去安排多个场地的麻烦,也能够让更多的活动得到举办。 4. 与活动组织者协调。小刘可以与各个活动的组织者协商,根据各个活动的时长和场地需求等因素来制定最佳的时间表,确保每个活动都能够得到尽可能充分的利用和举办。 总之,对于礼堂举办者来说,合理安排并举办更多的活动是一项重要的任务,需要综合考虑各种因素并灵活运用各种策略,才能够让更多的活动得到成功的举办。 ### 回答3: 首先,小刘需要将所有活动的计划时间整理出来,可以用表格或者表格来展示。将每个活动的名称、计划时间和其他相关信息填写到表格中,以便后续分析。 然后,小刘可以对这些活动进行分类,将相似性质的活动放在一起,比如学术活动、文艺活动、体育活动等。这样有助于他更好地理解每个活动的特点和安排情况。 接着,小刘可以从中挑选出一些重要的活动,优先安排在空闲时间段。比如学校的重要节日、学术会议等活动。然后,他可以进行时间表的优化,尝试在其他时间段安排更多的活动。根据每个活动的特点和参与人数,结合场地情况进行综合考虑,选择最适合的安排方案。 最后,小刘要做好调整准备。由于每个活动的参与人数、安排时间等因素不尽相同,可能会出现一些活动计划时间的冲突。小刘需要及时调整安排,确保每个活动都可以正常开展。 综合来看,小刘在安排学校礼堂的活动时需要考虑多方面因素,如活动类别、活动重要性、参与人数、场地等等。通过分类整理、优先安排和综合考虑等方式来确定最佳安排方案,同时保持高度的灵活性和调整能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值