1. 一个球场C的球迷看台可容纳M*N个球迷。官方想统计一共有多少球迷群体,最大的球迷群体有多少人。
球迷选座特性:1.
1.同球迷群体会选择相邻座位,不同球迷群体选择不相邻的座位。(相邻包括前后相邻、左右相邻、斜对角相邻);
2.给定一个M*N的二位球场,0代表该位置没人,1代表该位置有人,希望输出球队群体个数P,最大的球队群体人数Q。
输入:
第一行,2个数字,M N,使用英文逗号隔开
接下来M行,每行N个数字,使用英文逗号隔开
输出:
一行 ,2数字,P Q
import java.util.Scanner;
public class no1 {
static boolean[][] flag;
static int[][] input;
static int Q = 0;
static int P = 0;
static int num = 0;
static int m;
static int n;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] s = in.nextLine().split(",");
m = Integer.parseInt(s[0]);
n = Integer.parseInt(s[1]);
input = new int[m][n];
flag = new boolean[m][n];
for(int i = 0; i < m; i++){
String[] inputtemp = in.nextLine().split(",");
for(int j = 0; j < n; j++){
input[i][j] = Integer.parseInt(inputtemp[j]);
}
}
in.close();
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
P += find(i, j);
}
}
System.out.println(P +","+ Q);
}
public static int find(int i,int j){
if(input[i][j] == 1 && !flag[i][j]){
flag[i][j] = true;
num ++;
if(i != m - 1 && input[i+1][j] == 1 && !flag[i+1][j]){
find(i+1, j);
}
if(i != 0 && input[i-1][j] == 1 && !flag[i-1][j]){
find(i-1, j);
}
if(j != n-1 && input[i][j+1] == 1 && !flag[i][j+1]){
find(i, j+1);
}
if(j != 0 && input[i][j-1] == 1 && !flag[i][j-1]){
find(i, j-1);
}
if(i != 0 && j != 0 && input[i-1][j-1] == 1 && !flag[i-1][j-1]){
find(i-1, j-1);
}
if(i != 0 && j != n-1 && input[i-1][j+1] == 1 && !flag[i-1][j+1]){
find(i-1, j+1);
}
if(i != m-1 && j != n-1 && input[i+1][j+1] == 1 && !flag[i+1][j+1]){
find(i+1, j+1);
}
if(i != m-1 && j != 0 && input[i+1][j-1] == 1 && !flag[i+1][j-1]){
find(i+1, j-1);
};
}else{
if(Q < num)
Q = num;
num = 0;
flag[i][j] = true;
return 0;
}
return 1;
}
}
2. 文章病句标识
题目描述:
为了提高文章质量,每一篇文章(假设全部都是英文)都会有m名编辑审核,每个编辑独立工作,会把觉得有问题的句子通过下标记录下来,比如[1,10],1表示病句的第一个字符,10表示病句的最后一个字符。也就是从1到10个字符组成的句子,是有问题的。
现在需要把多名编辑有问题的句子合并起来,送给总编辑进行最终的审核。比如编辑a指出的病句是[1,10],[32,45];b编辑指出的病句是[5,16],[78,94],那么[1,10]和[5,16]是有交叉的,可以合并成[1,16],[32,45],78,94]
输入描述:
编辑数量m,之后每行是每个编辑的标记的下标集合,第一个和最后一个下标用英文逗号分隔,每组下标之间用分号分隔
输出描述:
合并后的下标集合,第一个和最后一个下标用英文逗号分隔,每组下标之间用分号分隔。返回结果是从小到大的递增排列。
输入:
3
1,10;32,45
78,94;5,16
80,100;200,220;16,32
输出:
1,45;78,100;200,220
/*
* 自己写一个数据结构,然后对这个数据结构排序.
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class no2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = Integer.parseInt(in.nextLine());
ArrayList<Interval> input = new ArrayList<>();
for(int i = 0; i < m; i++){
String[] errorsClassifiedByEditors = in.nextLine().split(";");
for(int j = 0; j < errorsClassifiedByEditors.length; j++){
String[] errors = errorsClassifiedByEditors[j].split(",");
input.add(new Interval(Integer.parseInt(errors[0]), Integer.parseInt(errors[1])));
}
}
in.close();
Collections.sort(input,new Comparator<Interval>(){
@Override
public int compare(Interval o1, Interval o2) {
return o1.start - o2.start;
}
});
Interval prev = null;
ArrayList<Interval> results = new ArrayList<>();
for(Interval item : input){
if(prev == null || item.start > prev.end){
results.add(item);
prev = item;
}else if(prev.end < item.end){
prev.end = item.end;
}
}
int count = 0;
for(Interval item : results){
if(count == results.size() - 1){
System.out.print(item.start + "," + item.end);
}else{
System.out.print(item.start + "," + item.end + ";");
}
count ++;
}
}
}
class Interval{
int start;
int end;
public Interval(int start, int end){
this.start = start;
this.end = end;
}
}
3. 小a和小b玩一个游戏,有n张卡牌,每张上面有两个正整数x,y。
取一张牌时,个人积分增加x,团队积分增加y。
求小a,小b各取若干张牌,使得他们的个人积分相等。
输入描述:
第一行n
接下来n行,每行两个整数x,y
输出描述:
一行一个整数
表示小a的积分和小b的积分相等的时候,团队积分的最大值。
输入:
4
3 1
2 2
1 4
1 4
输出
10
数据范围:
0 < n < 100
0 < x < 1000
0 < y < 1e6
\\动态规划
import java.util.Scanner;
public class test3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int[] key = new int[num];
int[] value = new int[num];
int max = 0;
for (int i = 0; i < num; i++) {
int inputKey = scan.nextInt();
int inputValue = scan.nextInt();
key[i] = inputKey;
value[i] = inputValue;
max = max>inputKey?max:inputKey;
}
int[][] result = dp(num, max, key, value);
System.out.print(result[num][0]);
}
public static int[][] dp(int num, int max, int[] key, int[] value){
int[][] result = new int[num+1][max+1];
for (int j = 0; j <= max; j++) result[0][j] = 0;
for (int i = 1; i <= num; i++){
for (int j = 0; j <= max; j++){
int temp1=0, temp2=0;
if (j-key[i-1]>=0) temp1 = result[i-1][j-key[i-1]] + value[i-1];
if (j+key[i-1]<=max) temp2 = result[i-1][j+key[i-1]] + value[i-1];
result[i][j] = Math.max(Math.max(result[i-1][j], temp1),temp2);
if (i == 1 && j == 0) result[i][j] = 0;
}
}
return result;
}
}
参考大神的代码:https://www.jianshu.com/p/83204e62ac94
4.两个长度为n的序列a,b
问有多少个区间[l,r]满足
max(a[l,r]) < min(b[l,r])
即a区间的最大值小于b区间的最小值
数据范围:
n < 1e5
ai,bi < 1e9
输入描述:
第一行一个整数n
第二行n个数,第i个为ai
第三行n个数,第i个为bi
0 <= l <= r < n
输出描述:
一行一个整数,表示答案
输入:
3
3 2 1
3 3 3
输出:
3
import java.util.Scanner;
public class test4 {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int[] arr1 = new int[num];
int[] arr2 = new int[num];
for (int i = 0; i < num; i++){
arr1[i] = scan.nextInt();
}
for (int i = 0; i < num; i++){
arr2[i] = scan.nextInt();
}
System.out.println(resolve(arr1, arr2, 0, 0, 0, 0));
}
public static int resolve(int[] arr1, int[] arr2, int start, int end, int maxIndex, int minIndex) {
if (start > end || end >= arr1.length) return 0;
int max = arr1[maxIndex]>arr1[end]?maxIndex:end;
int min = arr2[minIndex]<arr2[end]?minIndex:end;
if (arr1[max] >= arr2[min]) return resolve(arr1,arr2,start+1,start+1, start+1, start+1);
return 1+((end==arr1.length-1)?resolve(arr1,arr2,start+1,start+1, start+1, start+1):resolve(arr1,arr2,start,end+1,max,min));
}
}
参考大神的代码:https://www.jianshu.com/p/83204e62ac94
5. 小明在抖音关注了n个主播,每个主播每天的开播时间是固定的,分别在时刻开始,ti时刻结束。小明无法同时看两个直播。一天被分为m个时间单位。请问小明每天最多能完整观看多少个直播?
输入描述:
第一行一个整数,代表n
第二行一个整数,代表m
第三行空格分隔n*2个整数,代表s,t
输出描述:
一行一个整数,表示答案
输入:
3
10
0 3 3 7 7 0
输出
3
数据范围:
1 <= n <= 10^5
2 <= m <= 10^6
0 <= si,ti < m
import java.util.*;
public class test5 {
// 自定义区间类
public static class Interval{
public int begin;
public int end;
public Interval(int begin, int end){
this.begin = begin;
this.end = end;
}
public String toString(){
return String.format(begin+"-"+end);
}
}
public static class MyComparator implements Comparator<Object> {
public int compare(Object o1,Object o2){
Interval s1 = (Interval) o1;
Interval s2 = (Interval) o2;
return s1.begin - s2.begin;
}
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int over = scan.nextInt();
List<Interval> list = new ArrayList<>();
for (int i = 0; i < num; i++){
int start = scan.nextInt();
int end = scan.nextInt();
list.add(new Interval(start,end));
}
Collections.sort(list,new MyComparator());
List<Interval>[] arr = (ArrayList<Interval>[])new ArrayList[num];
for (int i = 0; i < num; i++){
arr[i] = new ArrayList<>();
}
for (Interval item : list){
for (int j = 0; j < num; j++){
if (arr[0].isEmpty()){
arr[0].add(item);
break;
}
if (arr[j].isEmpty()){
break;
}
else if (arr[j].get(arr[j].size()-1).end > item.begin){
continue;
}
else {
arr[j].add(item);
continue;
}
}
}
int max = 0;
for (List<Interval> item : arr){
max = max>item.size()?max:item.size();
}
System.out.println(max);
}
}
参考大神的代码:https://www.jianshu.com/p/83204e62ac94