会场安排问题(贪心算法) Comparator类排序的学习

主要是学习类如何进行排序利用  arrays  嗯 还有反正就是数组排序的学习

代码:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Comparator;
class node{
	public int beginn , endd;
	node(){}
	node(int x,int y){
		beginn = x; 
		endd = y;
	}
}
public class Main {
	private static Scanner sc;
	public static void main(String[] args)throws FileNotFoundException{
		try {
			sc = new Scanner(new FileInputStream("E:\\input.txt"));
			int n = sc.nextInt();
			node s[] = new node[n + 1];
			for(int i  = 1; i <= n; i++)
			{
				s[i] = new node();
				s[i].beginn = sc.nextInt();
				s[i].endd = sc.nextInt();
			}
			Comparator<node> cmp = new Comparator<node>(){
				@Override
				public int compare(node o1, node o2) {
					if(o1.endd != o2.endd)
						return o1.endd - o2.endd; //从小到大
					else 
						return o1.beginn - o2.beginn; //从小到大
				}
			};
			Arrays.sort(s, 1, n + 1, cmp);
//			for(int i = 1; i <= n; i++)
//				System.out.println(s[i].beginn + "  " + s[i].endd);
			
			int ans = 1;//表示可以开多少场活动
			int now = 1;//表示现在在哪里了
			for(int i = 2; i <= n; i ++)
			{
				if(s[i].beginn >= s[now].endd)
				{
					ans ++;
					now = i;
				}
			}
			PrintStream ps = new PrintStream("E:\\output.txt");
			System.setOut(ps);//把创建的打印输出流赋给系统。即系统下次向 ps输出
			System.out.println(ans);
		}catch(FileNotFoundException e) {
			e.printStackTrace();
		}

	}	
}

 

这个东西吧 主要学习

把类弄在外部,就可以实例化啦 

Comparator<node> cmp = new Comparator<node>(){
	@Override
	public int compare(node o1, node o2) {
	if(o1.endd != o2.endd)
		return o1.endd - o2.endd; //从小到大
	else 
		return o1.beginn - o2.beginn; //从小到大
	}
};
	Arrays.sort(s, 1, n + 1, cmp);
/*
Arrays的sort第一个是要排序的数组的名称
第二个是要排序开始的下标
第三个是排序结束的下标 这边要注意的就是左闭右开
第四个是自定义的排序方法
*/
/*
还有就是用Comparator <node> cmp = new Comparator<node>(){
};//这边记得加分号啊
还有奥 就是第一个减去第二个是从小到大......
第二个减去第一个是从大到小.....哭卿卿

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪心算法是一种常用的解决问题的方法,其中之一就是活动安排问题。在Java中,可以使用贪心算法来解决活动安排问题。 活动安排问题是指给定一组活动,每个活动都有一个开始时间和结束时间,要求在给定时间范围内安排尽可能多的活动,使得它们不会相互冲突。 下面是一个使用贪心算法解决活动安排问题的Java代码示例: ```java import java.util.ArrayList; import java.util.Comparator; import java.util.List; class Activity { int start; int end; public Activity(int start, int end) { this.start = start; this.end = end; } } public class ActivityScheduler { public static List<Activity> scheduleActivities(List<Activity> activities) { // 按照结束时间对活动进行排序 activities.sort(Comparator.comparingInt(a -> a.end)); List<Activity> selectedActivities = new ArrayList<>(); Activity lastActivity = activities.get(0); selectedActivities.add(lastActivity); for (int i = 1; i < activities.size(); i++) { Activity currentActivity = activities.get(i); // 如果当前活动的开始时间晚于上一个活动的结束时间,则选择该活动 if (currentActivity.start >= lastActivity.end) { selectedActivities.add(currentActivity); lastActivity = currentActivity; } } return selectedActivities; } public static void main(String[] args) { List<Activity> activities = new ArrayList<>(); activities.add(new Activity(1, 4)); activities.add(new Activity(3, 5)); activities.add(new Activity(0, 6)); activities.add(new Activity(5, 7)); activities.add(new Activity(3, 8)); activities.add(new Activity(5, 9)); activities.add(new Activity(6, 10)); activities.add(new Activity(8, 11)); activities.add(new Activity(8, 12)); activities.add(new Activity(2, 13)); activities.add(new Activity(12, 14)); List<Activity> selectedActivities = scheduleActivities(activities); for (Activity activity : selectedActivities) { System.out.println("活动开始时间:" + activity.start + ",活动结束时间:" + activity.end); } } } ``` 这段代码首先将活动按照结束时间进行排序,然后从第一个活动开始,依次选择结束时间不冲突的活动,直到无法选择为止。最后返回选择的活动列表。 运行以上代码,输出结果为: ``` 活动开始时间:1,活动结束时间:4 活动开始时间:5,活动结束时间:7 活动开始时间:8,活动结束时间:11 活动开始时间:12,活动结束时间:14 ``` 这些活动是在给定时间范围内可以安排的最多活动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值