import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str = bf.readLine();
int length = 1;
Set<String> set = new HashSet<>();
int i = 0;
while (i + length <= str.length()) {
set.add(str.substring(i, i + length));
i++;
if (set.size() == (int) Math.pow(4, length)) {
set = new HashSet<>();
length++;
i = 0;
}
}
System.out.println(length);
}
}
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] arg = reader.readLine().split(" ");
int n = Integer.parseInt(arg[0]);
int t = Integer.parseInt(arg[1]);
int a = Integer.parseInt(arg[2]);
if (t >= a) System.out.println("" + (a + n - t));
else System.out.println("" + (t + n - a));
}
}
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] s = bf.readLine().split(" ");
int l = Integer.parseInt(s[0]);
int r = Integer.parseInt(s[1]);
int count = 0;
//循环判断[L, R]区间内的每一个数字是否为即为回文又为素数
for (int i = l; i <= r; i++) {
if (isPalindrome(i) && isprime(i)) count++;
}
System.out.println(count);
}
//判断一个数是否为素数
public static boolean isprime(int n) {
if (n == 1) return false;
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
}
//判断一个数是否为回文
public static boolean isPalindrome(int n) {
int k = n;
int num = 0;
while (k != 0) {
num = num * 10 + k % 10;
k = k / 10;
}
return num == n;
}
}
输入包括两行,第一行一个整数n(1 ≤ n ≤ 50),即序列的长度
第二行n个整数x[i](1 ≤ x[i] ≤ 100),即序列中的每个数
输出描述:
输出一个整数,即最少需要移动的元素个数
示例1
输入
3
3 2 1
输出
2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] s = br.readLine().split(" ");
int[] x = new int[n];
for (int i = 0; i < n; i++) {
x[i] = Integer.parseInt(s[i]);
}
System.out.println(getMinMoveNum(n, x));
}
private static int getMinMoveNum(int n, int[] x) {
int[] y;
int sum = 0;
y = x.clone();
Arrays.sort(y);
for (int i = 0; i < n; i++) {
if (x[i] != y[i]) sum++;
}
return sum;
}
}
输入包括两行,第一行一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),其中只包含小写字母('a'-'z')。
第二行包含一个整数k(0 ≤ k ≤ length),即允许移除的字符个数。
输出描述:
输出一个整数,表示得到的最小价值
示例1
输入
aba
1
输出
2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int k = Integer.parseInt(br.readLine());
int[] z = new int[26];
for (int i = 0; i < str.length(); i++) {
z[str.charAt(i) - 'a']++;
}
for (int i = 0; i < k; i++) {
int maxId = 0;
for (int j = 0; j < 26; j++) {
if (z[j] > z[maxId]) maxId = j;
}
z[maxId]--;
}
int res = 0;
for (int i = 0; i < 26; i++) {
res += Math.pow(z[i], 2);
}
System.out.println(res);
}
}
输入包括两行,第一行包括一个整数n(1 ≤ n ≤ 50),即玩家的人数
第二行n个整数x[i](0 ≤ x[i] ≤ 100000),即每个玩家写下的整数。
输出描述:
输出一个整数,表示赢得游戏的那个玩家获得的最大数字是多少。
示例1
输入
3
9638 8210 331
输出
3689
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] s = br.readLine().split(" ");
int[] a = new int[n];
for (int i = 0; i < n; i++) {
char[] t = s[i].toCharArray();
Arrays.sort(t);
String c = new String(t);
a[i] = Integer.parseInt(c);
}
Arrays.sort(a);
System.out.println(a[n - 1]);
}
}
QY12 红和绿
题目描述
牛牛有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。牛牛现在可以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将会被覆盖。牛牛的目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。牛牛想知道他最少需要涂染几个正方形。
如样例所示: s = RGRGR
我们涂染之后变成RRRGG满足要求了,涂染的个数为2,没有比这个更好的涂染方案。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String[] str = bufr.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int m = Integer.parseInt(str[1]);
int s = m + n;
double f0 = 0, f1 = s / 2.0;
for (int k = 2; k <= m; k++) {
double cur = s * (s - 1) / (1.0 * k * (2 * s - k - 1)) + 2 * (s - k) * 1.0 / (2 * s - k - 1) * f1 + (k - 1) * 1.0 / (2 * s - k - 1) * f0;
f0 = f1;
f1 = cur;
}
System.out.println(Math.round(f1 * 10) / 10.0);
}
}
第一行一个整数n,即序列的长度。(2<= n <= 100000)
第二行n个数,依次表示这个序列每个数值V[i], (1 ≤ V[i] ≤ 10^8)且保证V[1]到V[n]中至少存在不同的两个值.
输出描述:
输出一个整数,即最大的幸运值
示例1
输入
5
5 2 1 4 3
输出
7
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] str = br.readLine().split(" ");
int[] arr = new int[n];
int res = 0;
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(str[i]);
}
for (int i = 0; i < n; i++) {
for (int j = i - 1; j >= 0; j--) {
if (arr[j] > arr[i]) {
res = Math.max(res, arr[j] ^ arr[i]);
break;
}
}
for (int j = i + 1; j < n; j++) {
if (arr[j] > arr[i]) {
res = Math.max(res, arr[j] ^ arr[i]);
break;
}
}
}
System.out.println(res);
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.Buffer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s = reader.readLine().trim();
System.out.println(makeBracketStrComplete(s));
}
public static int makeBracketStrComplete(String s) {
int count = 0;
int result = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
count++;
} else if (s.charAt(i) == ')') {
if (--count < 0) {
result++;
count++;
}
}
}
return result + count;
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String strSum;
while ((strSum = br.readLine()) != null) System.out.println(solve(Long.parseLong(strSum)));
}
private static long solve(long sum) {
// 使用二分法搜索法,检验数mid的sum是否符合题意
long l = 0, r = sum;
while (l <= r) {
long mid = l + ((r - l) >>> 1);
long midRes = getSum(mid);
if (midRes == sum) return mid;
else if (midRes < sum) l = mid + 1;
else r = mid - 1;
}
return -1;
}
private static long getSum(long num) {
long sum = 0;
while (num != 0) {
sum += num;
num /= 10;
}
return sum;
}
}
QY20 冒泡排序
题目描述
牛牛学习了冒泡排序,并写下以下冒泡排序的伪代码,注意牛牛排序的数组a是从下标0开始的。
BubbleSort(a):
Repeat length(a)-1 times:
For every i from 0 to length(a) - 2:
If a[i] > a[i+1] then:
Swap a[i] and a[i+1]
牛牛现在要使用上述算法对一个数组A排序。
在排序前牛牛允许执行最多k次特定操作(可以不使用完),每次特定操作选择一个连续子数组,然后对其进行翻转,并且k次特定操作选择的子数组不相交。
例如A = {1, 2, 3, 4, 5, 6, 7}, k = 1,如果牛牛选择的子数组是[2,4](注意下标从0开始),那么翻转之后的数组变为A = {1, 2, 5, 4, 3, 6, 7}。
牛牛知道冒泡排序的效率一定程度上取决于Swap操作次数,牛牛想知道对于一个数组A在进行k次特定操作之后,再进行上述冒泡排序最少的Swap操作次数是多少?
输入描述:
输入包括两行,第一行包括两个正整数n和k(2 ≤ n ≤ 50, 1 ≤ k ≤ 50),表示数组的长度和允许最多的特定操作次数。
第二行n个正整数A[i](1 ≤ A[i] ≤ 1000),表示数组内的元素,以空格分割。
输出描述:
输出一个整数,表示在执行最多k次特定操作之后,对数组进行上述冒泡排序需要的Swap操作次数。
示例1
输入
3 2
2 3 1
输出
1
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
int n = Integer.parseInt(s[0]);
int k = new Integer(s[1]);
s = br.readLine().split(" ");
int[] nums = new int[n];
for (int i = 0; i < nums.length; i++) {
nums[i] = new Integer(s[i]);
}
int[][] dp = new int[n + 1][k + 1];
//dp[i][j]表示前i个数进行j次反转之后最多能消除多少个逆序对
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= k; j++) {
int tmp = Integer.MIN_VALUE;
for (int t = i - 1; t >= 1; t--) {
tmp = Math.max(beforeReverse(nums, t - 1, i - 1) - afterReverse(nums, t - 1, i - 1) + dp[t - 1][j - 1], tmp);
}
dp[i][j] = Math.max(dp[i - 1][j], tmp);
}
}
System.out.println(beforeReverse(nums, 0, n - 1) - dp[n][k]);
}
//求出反转之后还有多少个逆序对,
public static int afterReverse(int[] nums, int left, int right) {
int num = 0;
for (int i = right; i > left; i--) {
for (int j = i - 1; j >= left; j--) {
if (nums[j] < nums[i]) num++;
}
}
return num;
}
//求出在某个范围内有多少个逆序对
public static int beforeReverse(int[] nums, int left, int right) {
int num = 0;
for (int i = left; i < right; i++) {
for (int j = i + 1; j <= right; j++) {
if (nums[i] > nums[j]) num++;
}
}
return num;
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
int stack = 0, max = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '(') stack++;
if (str.charAt(i) == ')') stack--;
max = Math.max(max, stack);
}
System.out.println(max);
in.close();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
/**
* 解决方法:
* 给奶牛所希望的数字排个序,然后第一个奶牛有X[0]种方法,第二个奶牛有X[1]-1种方法。。。
*/
public class Main {
private static final long MOD = 1000000007;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
long n = Integer.parseInt(bf.readLine());
String[] str = bf.readLine().split(" ");
int[] num = new int[str.length];
for (int i = 0; i < n; i++) {
num[i] = Integer.parseInt(str[i]);
}
Arrays.sort(num);
long res = 1;
for (int j = 0; j < str.length; j++) {
res = res * ((num[j] - j) % MOD);
res = res % MOD;
}
System.out.println(res);
}
}
QY23 平方串
题目描述
如果一个字符串S是由两个字符串T连接而成,即S = T + T, 我们就称S叫做平方串,例如"","aabaab","xxxx"都是平方串.
牛牛现在有一个字符串s,请你帮助牛牛从s中移除尽量少的字符,让剩下的字符串是一个平方串。换句话说,就是找出s的最长子序列并且这个子序列构成一个平方串。
输入描述:
输入一个字符串s,字符串长度length(1 ≤ length ≤ 50),字符串只包括小写字符。
输出描述:
输出一个正整数,即满足要求的平方串的长度。
示例1
输入
frankfurt
输出
4
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int res = 0;
for (int i = 1; i < s.length(); i++) {
res = Math.max(res, lcs(s.substring(0, i), s.substring(i)));
}
System.out.println(res * 2);
}
//求s1和s2的最长公共子序列的长度
private static int lcs(String s1, String s2) {
//dp[i + 1][j + 1]: 以s1[i]、s2[j]为结尾的最长公共子序列的长度
int[][] dp = new int[s1.length() + 1][s2.length() + 1];
for (int i = 0; i < s1.length(); i++) {
for (int j = 0; j < s2.length(); j++) {
if (s1.charAt(i) == s2.charAt(j)) dp[i + 1][j + 1] = dp[i][j] + 1;
else dp[i + 1][j + 1] = Math.max(dp[i + 1][j], dp[i][j + 1]);
}
}
return dp[s1.length()][s2.length()];
}
}