气球java游戏_气球游戏-2019腾讯笔试

气球游戏-2019腾讯笔试

小Q在进行射击气球的游戏,如果小Q在连续T枪中打爆了所有颜色的气球,将得到一只QQ公仔作为奖励。(每种颜色的球至少被打爆一只)。

这个游戏中有m种不同颜色的气球,编号1到m。

小Q一共有n发子弹,然后连续开了n枪。

小Q想知道在这n枪中,打爆所有颜色的气球最少用了连续几枪?

输入格式

第一行包含两个整数n和m。

第二行包含n个整数,分别表示每一枪打中的气球的颜色,0表示没打中任何颜色的气球。

输出格式

一个整数表示小Q打爆所有颜色气球用的最少枪数。

如果小Q无法在这n枪打爆所有颜色的气球,则输出-1。

数据范围

1≤n≤\(10^6\),

1≤m≤2000

输入样例:

12 5

2 5 3 1 3 2 4 1 0 5 4 3

输出样例:

6

样例解释

有五种颜色的气球,编号1到5。

游客从第二枪开始直到第七枪,这连续六枪打爆了5 3 1 3 2 4这几种颜色的气球,包含了从1到5的所有颜色,所以最少枪数为6。

解法一:双指针算法

贪心思想,用指针i,j维护区间[i, j],移动j扩大区间使得区间内包含所有颜色气球,当满足时,移动i指针使得[i,j]区间变小依然能满足包含所以颜色的气球,此时更新一次答案(区间大小);直到遍历完整个数组。

i,j都只增不减,因此时间复杂度为O(n);需要维护区间内每种气球的数量,以及一个HashSet 快速判断区间内气球的种类数量,或者直接使用HashMap,因此空间复杂度为O(m)。

import java.util.*;

public class Main {

static int search(int[] a, int n, int m) {

int[] cnt = new int[m+1];

Set set = new HashSet<>();

int res = -1;

int i = 0, j = 0;

while(i <= j && j < n) {

cnt[a[j]]++;

if(a[j] != 0) set.add(a[j]);

if(set.size() >= m) {

while(i < j) {

if(a[i] != 0 && cnt[a[i]] == 1)

break;

cnt[a[i]]--;

i++;

}

if(res == -1 || j-i+1 < res) res = j-i+1;

}

// System.out.println(i+"---"+j);

j++;

}

return res;

}

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int n = sc.nextInt();

int m = sc.nextInt();

int[] a = new int[n];

for(int i=0; i< n; i++)

a[i] = sc.nextInt();

System.out.println(search(a, n, m));

}

}

解法二、二分查找(较为暴力)

如果没想到第一种方法,则可以暴力做。显然,答案一定在区间[m,n]内,二分查找答案,时间复杂度为O(log(n-m))。判断k是否为答案时间复杂度为O(n),因此整个程序时间复杂度O(nlogn)。大致计算\(10^6 \times \log_2^{10^6}\approx 10^6 \times log_2^{2^{20}}=2 \times 10^7\)

时间上依然可以接受;空间复杂度同上。

import java.util.*;

public class Main {

static int search(int[] a, int l, int r){

int m=l, n = r;

Set set = new HashSet<>();

int[] cnt = new int[m+1];

for(int i=0; i < n; i++)

if(a[i] != 0)

set.add(a[i]);

if(set.size() < m) return -1;

while(l < r) {

int mid = (l+r)/2;

set.clear();

Arrays.fill(cnt,0);

for(int i=0; i < n; i++) {

if(a[i] != 0 && !set.contains(a[i]))

set.add(a[i]);

cnt[a[i]]++;

if(i >= mid) {

cnt[a[i-mid]]--;

if(a[i-mid] != 0 && cnt[a[i-mid]]<= 0)

set.remove(a[i-mid]);

}

if(set.size() >= m) break;

}

if(set.size() >= m)

r=mid;

else

l=mid+1;

}

return l;

}

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int n = sc.nextInt();

int m = sc.nextInt();

int[] a = new int[n];

for(int i=0; i < n; i++)

a[i] = sc.nextInt();

System.out.println(search(a, m, n));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给你提供一个简单的爆气球游戏Java代码框架,你可以在此基础上进行开发: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class BalloonGame extends JPanel implements ActionListener, MouseListener { private static final int WIDTH = 800; private static final int HEIGHT = 600; private static final int MAX_BALLOONS = 20; private static final int BALLOON_RADIUS = 30; private static final int BALLOON_SPEED = 5; private Timer timer; private Balloon[] balloons; private int numBalloons; public BalloonGame() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); setBackground(Color.WHITE); balloons = new Balloon[MAX_BALLOONS]; numBalloons = 0; timer = new Timer(50, this); timer.start(); addMouseListener(this); } public void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i < numBalloons; i++) { balloons[i].draw(g); } } public void actionPerformed(ActionEvent e) { for (int i = 0; i < numBalloons; i++) { balloons[i].move(); } repaint(); } public void mouseClicked(MouseEvent e) { int x = e.getX(); int y = e.getY(); for (int i = 0; i < numBalloons; i++) { if (balloons[i].contains(x, y)) { balloons[i].pop(); return; } } } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} private class Balloon { private int x; private int y; private int radius; private int dx; private int dy; private boolean popped; public Balloon() { radius = BALLOON_RADIUS; x = (int) (Math.random() * (WIDTH - 2 * radius)) + radius; y = (int) (Math.random() * (HEIGHT - 2 * radius)) + radius; dx = (int) (Math.random() * 2 * BALLOON_SPEED) - BALLOON_SPEED; dy = (int) (Math.random() * 2 * BALLOON_SPEED) - BALLOON_SPEED; popped = false; } public void draw(Graphics g) { if (!popped) { g.setColor(Color.RED); g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius); } } public void move() { if (!popped) { x += dx; y += dy; if (x < radius || x > WIDTH - radius) { dx = -dx; } if (y < radius || y > HEIGHT - radius) { dy = -dy; } } } public boolean contains(int x, int y) { return !popped && Math.sqrt((this.x - x) * (this.x - x) + (this.y - y) * (this.y - y)) < radius; } public void pop() { popped = true; } } public static void main(String[] args) { JFrame frame = new JFrame("Balloon Game"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(new BalloonGame()); frame.pack(); frame.setVisible(true); } } ``` 这个代码框架中定义了一个 `BalloonGame` 类,实现了 `ActionListener` 和 `MouseListener` 接口,同时定义了一个 `Balloon` 类,用于表示气球的属性和行为。在 `BalloonGame` 类的构造方法中初始化了气球数组、定时器和鼠标事件监听器,并且在 `paintComponent` 方法中绘制气球。在 `actionPerformed` 方法中更新气球的位置,在 `mouseClicked` 方法中判断鼠标点击的位置是否在气球范围内,并弹掉气球。最后,在 `main` 方法中创建一个 `JFrame` 对象,并将 `BalloonGame` 对象作为其内容面板。你可以根据这个代码框架进行开发,实现你自己的爆气球游戏

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值