第二题
题目
* 给一个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
思路:最小生成树,改成最大
代码