0基础学Java:Lab6-贪心算法-用最少数量的箭引爆气球

        明天Java上机考试,今天初学Java,今日成果:学会了Java的输入输出,明天考试,未来可期。

        

题目描述

描述

有一些球形气球在一堵用XY平面表示的墙面上。墙面上的气球记录在整数数组points,其中points[i]=[x_start,x_end]表示水平直径在x_start和x_end之间的气球。你不知道气球的确切y坐标。

一支弓箭可以沿着x轴从不同点完全垂直地射出。在坐标x处射出一支箭,若有一个气球的直径的开始和结束坐标为x_start,x_end,且满足x_start <= x <= x_end,则该气球会被引爆。可以射出的弓箭的数量没有限制。弓箭一旦被射出后,可以无限地前进。

输入:

第一行是一个整数N,表示气球的数目。

接下来的N行,每行为一个气球的开始和结束坐标

输出:

打印引爆所有气球所必须射出的最小弓箭数。

示例1:

输入:

4

10 16

2 8

1 6

7 12

输出:

2

解释:气球可以用2支箭来爆破:

- 在x=6处射出箭,击破气球[2,8]和[1,6]

- 在x=11处射出箭,击破气球[10,16]和[7,12]

示例2:

输入:

4

1 2

2 3

3 4

4 5

输出:

2
解释:气球可以用2支箭来爆破:
- 在x = 2处发射箭,击破气球[1,2]和[2,3]
- 在x = 4处射出箭,击破气球[3,4]和[4,5]

提示:

  • points.length <= 100
  • points[i].length == 2
  • -100 <= x_start < x_end <= 100

样例输入输出

样例2

输入:

4
1 2
2 3
3 4
4 5

输出:

2

样例1

输入:

4
10 16
2 8
1 6
7 12

输出:

2

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

public class Main {
	
	public static class Points {
		public int x_start;
		public int x_end;
		public Points(int x_start, int x_end) {
			this.x_start = x_start;
			this.x_end = x_end;
		}
		public int getX_start() {
			return x_start;
		}
		public int getX_end() {
			return x_end;
		}
		public static class myComparator implements Comparator<Points> {
			public int compare(Points p1, Points p2) {
				return p2.x_end - p1.x_end;
			}
		}
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		
		ArrayList<Points> points = new ArrayList<>();
		for (int i = 0; i < N; i++) 
		{
			int x_start = sc.nextInt();
			int x_end = sc.nextInt();
			Points point = new Points(x_start, x_end);
			points.add(point);
		}
		
		Collections.sort(points, new Points.myComparator());
		
		int num = 0 ;
		int j = 1;
		for (int i = 0; i < N;)
		{
			while ( i + j < N && points.get(i).getX_start() <= points.get(i + j).getX_end())
			{	
				j++;
			}
			num++;
			i += j;
			j = 1;
		}
		
		System.out.println(num);	
	}			
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值