1.苹果分堆
计算累加小组成员数,结合二分查找,复杂度O( min(n, mlogn) )
package wangyi123;
import java.util.Scanner;
public class groupNum {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int[] arr = new int[n];
arr[0] = sc.nextInt();
for (int i = 1; i < n; i++) {
arr[i] = arr[i - 1] + sc.nextInt();
}
int m = sc.nextInt();
int query = 0;
int index = 0;
for (int i = 0; i < m; i++) {
query = sc.nextInt();
index = search(arr, query);
System.out.print(index + " ");
}
}
sc.close();
}
public static int search(int a[], int target) {
int left = 0;
int right = a.length - 1;
int mid = 0;
while (left < right) {
mid = left + (right - left) / 2;
if (target >= a[mid]) {
left = ++mid;
} else {
right = mid;
}
}
return left + 1;
}
}
2.字符串理论
.
package wangyi123;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class straz {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int k = sc.nextInt();
List<String> result = new ArrayList<>();
dfs(n, m, k, "", result);
System.out.println(result);
}
static boolean flag = false;
public static void dfs(int n, int m, int k, String s, List<String> result) {
if (n == 0 && m == 0) {
result.add(s);
if (result.size() == k) {
flag = true;
}
return;
}
if (flag) {
return;
}
if (n > 0) {
dfs(n - 1, m, k, s + 'a', result);
}
if (m > 0) {
dfs(n, m - 1, k, s + 'z', result);
}
}
}
3.上课瞌睡
package wangyi123;
import java.util.Scanner;
public class sleep {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] a = new int[n];
int[] t = new int[n];
for (int i = 0; i < n; i++)
a[i] = sc.nextInt();
int now = 0;
for (int i = 0; i < n; i++) {
t[i] = sc.nextInt();
now += t[i] * a[i];
}
int res = now;
for (int i = 0; i < n; i++) {
if (t[i] == 0) {
now += a[i];
}
if (i + 1 >= k) {
res = Math.max(res, now);
if (t[i + 1 - k] == 0) {
now -= a[i + 1 - k];
}
}
}
System.out.println(res);
}
}