贝壳java开发笔试 2020 8 11

第二题

题目

* 给一个n*m的表格染色,相邻(左右上下,紧挨着)的格子颜色必须不同,每个颜色染的格子数量必须相同,问最少需要多少种颜色。

思路

1 * 1 输出 1

2 * 3 输出 2

100 * 100 输出 2

3 * 3 输出 3

15 * 27 输出 3

77 * 49 输出 7

自己画个图推一推,发现了什么?仔细想想应该知道怎么做了。

第三题

题目

* 输入n,表示将要输入n个数字,求其连续的一段数字的异或值最大。显然所有的数字进行异或就是最大的值,但是题目要求的是,求一个最短的区间,让它们进行异或,也能得出这个最大异或值,你要求最短的区间

* 样例

* 输入

* 3

* 1 2 3

* 输出

* 1

* 解释

* 1,2,3

* 1,2

* 3

* 都满足异或值最大,但是单独一个数字3就是最短的区间。

* 限制

* n >= 1 && n <= 10^6

* 输入的n个数字都是int型

思路:二分 + 暴力

代码

package 贝壳;

import java.util.Scanner;

public class Question3_3 {

    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int n = sc.nextInt();
        int []A = new int[n];
        long ans = 0;
        for (int i = 0; i < n; i++){
            A[i] = sc.nextInt();
            ans |= A[i];
        }
        //System.out.println("ans : " + ans);
        int left = 0;
        int right = n;
        int mid;
        boolean flag = false;
        long temp;
        int min0 = 9999999;
        while (left <= right) {
            mid = (left + right) / 2;
            flag = false;
            for (int i = 0; i <= n - mid; i++) {
                temp = 0;
                for (int j = i; j < i + mid; j++) {
                    temp |= A[j];
                    if (temp == ans) {
                        flag = true;
                        break;
                    }
                    //System.out.print(j + " ");
                }
                //System.out.println();
                //System.out.println( i + " : " + temp);
                if (flag) {
                    break;
                }
            }

            if (flag) {
                right = mid - 1;
                min0 = Math.min(mid,min0);
            } else{
                left = mid + 1;
            }
        }
        System.out.println(min0);
    }
}

第四题

题目意思翻译过了...
 * 题目意思
 * 输入 n(表示有n个城市,城市编号1-n), m
 * m表示接下来输入m行数据
 * 每行输入三个数u,v,w 表示u能通向v, 花费为w。
 * 删除一些边,让最少的边保证城市的连通。在这个基础上,求城市连通的最大花费。
 * 5 5
 * 1 2 1
 * 1 5 1
 * 3 5 1
 * 2 4 1
 * 4 5 2
 *
 * 输出 5

思路:最小生成树,改成最大

代码

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值