1,k倍区间
用集合HashMap蛮力解决
package java2017;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.function.BiConsumer;
public class k倍区间 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
int[] pre = new int[n + 1];
int count = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 1; i < pre.length; i++) {
pre[i] = pre[i - 1] + scanner.nextInt();
if(pre[i]%k==0) {
count++;
if (!map.containsKey(pre[i] % k)) {
map.put(pre[i] % k, 1);
} else {
count+=map.get(pre[i] % k);
map.put(pre[i] % k, map.get(pre[i] % k) + 1);
}
}else {
if (!map.containsKey(pre[i] % k)) {
map.put(pre[i] % k, 1);
} else {
count+=map.get(pre[i] % k);
map.put(pre[i] % k, map.get(pre[i] % k) + 1);
}
}
}
System.out.println(count);
map.forEach(new BiConsumer<Integer, Integer>() {
@Override
public void accept(Integer key, Integer value) {
// TODO Auto-generated method stub
System.out.printf("%s:%s",key,value);
System.out.println();
}
});
}
}
用前缀和解决
package java2017;
import java.util.Scanner;
public class K倍区间前缀和 {
private static int[] s;
private static int ans = 0;
private static int[] mod = new int[100000];
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
s = new int[n + 10];
for (int i = 1; i <= n; i++) {
int t = scanner.nextInt();
// 前缀和
s[i] = s[i - 1] + t;
}
// 同余定理
for (int i = 0; i <= n; i++) {
int p = mod[s[i] % k]++;
ans += p;
System.out.println(p);
}
System.out.println(ans);
}
}
2,凑包子
package java2017;
import java.util.Scanner;
public class 凑包子 {
private static int n, g;
private static int[] a = new int[101];
private static boolean[] f = new boolean[10000];
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
f[0] = true;
for (int i = 1; i <= n; i++) {
a[i] = scanner.nextInt();
if (i == 1)
g = a[i];
else {
g = gcd(a[i], g);
}
for (int j = 0; j < 10000-a[i]; j++) {
if (f[j])
f[j + a[i]] = true;
}
}
int ans = 0;
if (g != 1) {
System.out.println("INF\n");
return;
}
for (int j = 0; j < 10000; j++) {
if (!f[j]) {
System.out.println(j);
ans++;
}
}
System.out.println(ans);
}
private static int gcd(int a, int b) {
if (b == 0)
return a;
if (b > a) {
a = a ^ b;
b = b ^ a;
a = a ^ b;
}
return gcd(b, a % b);
}
}
3,分巧克力
package java2017;
import java.util.Scanner;
public class 分巧克力二分 {
private static int r = 0;
private static int l = 0;
private static int n = 0;
private static int[][] kk;
private static int k;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
k = scanner.nextInt();
kk = new int[n][2];
for (int i = 0; i < n; i++) {
kk[i][0] = scanner.nextInt();
kk[i][1] = scanner.nextInt();
r = Math.max(kk[i][0], kk[i][1]);
}
while (l < r) {
int mid = (l + r + 1) / 2;
if (check(mid)) {
l = mid;
} else {
r = mid - 1;
}
}
System.out.println(l);
}
private static boolean check(int mid) {
int ans = 0;
for (int i = 0; i < n; i++) {
ans += (kk[i][0] / mid) * (kk[i][1] / mid);
}
return ans >= k;
}
}
4,承压计算
7
5 8
7 8 8
9 2 7 2
8 1 4 9 1
8 1 8 8 4 1
7 9 6 1 4 5 4
5 6 5 5 6 9 5 6
5 5 4 7 9 3 5 5 1
7 5 7 9 7 4 7 3 3 1
4 6 4 5 5 8 8 3 2 4 3
1 1 3 3 1 6 6 5 5 4 4 2
9 9 9 2 1 9 1 9 2 9 5 7 9
4 3 3 7 7 9 3 6 1 3 8 8 3 7
3 6 8 1 5 3 9 5 8 3 8 1 8 3 3
8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9
8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4
2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9
7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6
9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3
5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9
6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4
2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4
7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6
1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3
2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8
7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9
7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6
5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
其中的数字代表金属块的重量(计量单位较大)。
最下一层的X代表30台极高精度的电子秤。
假设每块原料的重量都十分精确地平均落在下方的两个金属块上,
最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。
电子秤的计量单位很小,所以显示的数字很大。
工作人员发现,其中读数最小的电子秤的示数为:2086458231
请你推算出:读数最大的电子秤的示数为多少?
package java2017;
import java.util.Arrays;
import java.util.Iterator;
import org.omg.DynamicAny._DynUnionStub;
public class 承压计算 {
public static void main(String[] args) {
double[][] num = {
{ 7 },
{ 5, 8 },
{ 7, 8, 8 },
{ 9, 2, 7, 2 },
{ 8, 1, 4, 9, 1 },
{ 8, 1, 8, 8, 4, 1 },
{ 7, 9, 6, 1, 4, 5, 4 },
{ 5, 6, 5, 5, 6, 9, 5, 6 },
{ 5, 5, 4, 7, 9, 3, 5, 5, 1 },
{ 7, 5, 7, 9, 7, 4, 7, 3, 3, 1 },
{ 4, 6, 4, 5, 5, 8, 8, 3, 2, 4, 3 },
{ 1, 1, 3, 3, 1, 6, 6, 5, 5, 4, 4, 2 },
{ 9, 9, 9, 2, 1, 9, 1, 9, 2, 9, 5, 7, 9 },
{ 4, 3, 3, 7, 7, 9, 3, 6, 1, 3, 8, 8, 3, 7 },
{ 3, 6, 8, 1, 5, 3, 9, 5, 8, 3, 8, 1, 8, 3, 3 },
{ 8, 3, 2, 3, 3, 5, 5, 8, 5, 4, 2, 8, 6, 7, 6, 9 },
{ 8, 1, 8, 1, 8, 4, 6, 2, 2, 1, 7, 9, 4, 2, 3, 3, 4 },
{ 2, 8, 4, 2, 2, 9, 9, 2, 8, 3, 4, 9, 6, 3, 9, 4, 6, 9 },
{ 7, 9, 7, 4, 9, 7, 6, 6, 2, 8, 9, 4, 1, 8, 1, 7, 2, 1, 6 },
{ 9, 2, 8, 6, 4, 2, 7, 9, 5, 4, 1, 2, 5, 1, 7, 3, 9, 8, 3, 3 },
{ 5, 2, 1, 6, 7, 9, 3, 2, 8, 9, 5, 5, 6, 6, 6, 2, 1, 8, 7, 9, 9 },
{ 6, 7, 1, 8, 8, 7, 5, 3, 6, 5, 4, 7, 3, 4, 6, 7, 8, 1, 3, 2, 7, 4 },
{ 2, 2, 6, 3, 5, 3, 4, 9, 2, 4, 5, 7, 6, 6, 3, 2, 7, 2, 4, 8, 5, 5, 4 },
{ 7, 4, 4, 5, 8, 3, 3, 8, 1, 8, 6, 3, 2, 1, 6, 2, 6, 4, 6, 3, 8, 2, 9, 6 },
{ 1, 2, 4, 1, 3, 3, 5, 3, 4, 9, 6, 3, 8, 6, 5, 9, 1, 5, 3, 2, 6, 8, 8, 5, 3 },
{ 2, 2, 7, 9, 3, 3, 2, 8, 6, 9, 8, 4, 4, 9, 5, 8, 2, 6, 3, 4, 8, 4, 9, 3, 8, 8 },
{ 7, 7, 7, 9, 7, 5, 2, 7, 9, 2, 5, 1, 9, 2, 6, 5, 3, 9, 3, 5, 7, 3, 5, 4, 2, 8, 9 },
{ 7, 7, 6, 6, 8, 7, 5, 5, 8, 2, 4, 7, 7, 4, 7, 2, 6, 9, 2, 1, 8, 2, 9, 8, 5, 7, 3, 6 },
{ 5, 9, 4, 5, 5, 7, 5, 5, 6, 3, 5, 3, 9, 5, 8, 9, 5, 4, 1, 2, 6, 1, 4, 3, 5, 3, 2, 4, 1 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
for (int i = 1; i < num.length; i++) {
for (int j = 0; j < num[i].length; j++) {
if (j == 0) {
num[i][0] += num[i - 1][0] / 2;
} else if (j == num[i].length - 1) {
num[i][j] += num[i - 1][j - 1] / 2;
} else {
num[i][j] += num[i - 1][j - 1] / 2 + num[i - 1][j] / 2;
}
}
}
double min = num[29][0];
double max = num[29][1];
for (int i = 2; i < num[29].length; i++) {
if (num[29][i] < min) {
min = num[29][i];
}
if (num[29][i] > max) {
max = num[29][i];
}
}
System.out.println("max:"+max);
System.out.println("min:"+min);
System.out.println((max *2086458231) / min );
}
}
5,最长公共子串和最长公共子序列
package java2017;
public class 最长公共子串 {
private static int start=0;
static int f(String s1, String s2) {
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
int[][] a = new int[c1.length + 1][c2.length + 1];
int max = 0;
for (int i = 1; i < a.length; i++) {
for (int j = 1; j < a[i].length; j++) {
if (c1[i - 1] == c2[j - 1]) {
a[i][j] =a[i-1][j-1]+1; // 填空
if (a[i][j] > max) {
max = a[i][j];
start=i-max;
}
}
}
}
System.out.println(s1.substring(start,start+max));
return max;
}
public static void main(String[] args) {
int n = f("abcdkkk", "baabcdadabc");
System.out.println(n);
}
}
package java2017;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;
public class 最长公共子序列 {
private static char s1[];
private static char s2[];
private static int [][]dp;
private static TreeSet<String> set=new TreeSet<>();
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
s1=scanner.next().toCharArray();
s2=scanner.next().toCharArray();
System.out.println(Arrays.toString(s1));
System.out.println(Arrays.toString(s2));
dp=new int[s1.length+1][s2.length+1];
int maxlength= lmax();
System.out.println(maxlength);
String str="";
printMaxLength(s1.length,s2.length,str);
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
private static void printMaxLength(int n,int m,String str) {
while(n>0&m>0) {
if(s1[n-1]==s2[m-1]) {
n--;
m--;
str=s1[n]+str;
}else {
if(dp[n-1][m]>dp[n][m-1]) {
n--;
}else if(dp[n-1][m]<dp[n][m-1]) {
m--;
}else {
printMaxLength(n-1,m,str);
printMaxLength(n,m-1,str);
return;
}
}
}
if(str.length()>0) set.add(str);
}
private static int lmax() {
for(int n=1;n<=s1.length;n++) {
for(int m=1;m<=s2.length;m++) {
if(s1[n-1]==s2[m-1]) {
dp[n][m]=dp[n-1][m-1]+1;
}else {
dp[n][m]=Math.max(dp[n-1][m],dp[n][m-1]);
}
}
}
return dp[s1.length][s2.length];
}
}
6,魔方状态
package java2017;
import java.util.Arrays;
import java.util.HashSet;
public class 魔方状态 {
private static int []a= {1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3};
private static boolean[]vis=new boolean[24];
private static int num=0;
private static HashSet<String> set=new HashSet<>();
public static void main(String[] args) {
int []path=new int[24];
f(0);
System.out.println(set.size());
}
private static void f(int k) {
if(k==24) {
set.add(Arrays.toString(a));
}
for(int i=k;i<24;i++) {
int temp=a[k];
a[k]=a[i];
a[i]=temp;
f(k+1);
temp=a[k];
a[k]=a[i];
a[i]=temp;
}
}
}