Каталог статей
Тема 1
Описание темы
возрастное совпадение
Этот вопрос заполняет пустые поля.После вычисления результата используйте оператор вывода в коде, чтобы вывести заполненный результат.
Сяо Мин ходил в кино со своим двоюродным братом, и кто-то спросил их возраст. Сяо Мин сказал: «Этот год — наш счастливый год. Четыре цифры года моего рождения в сумме дают ровно мой возраст. Так и у двоюродного брата. Известно, что это 2014 год, и возраст, упомянутый Сяо Мином, относится к годовалому возрасту.
Пожалуйста, сделайте вывод и укажите год рождения Сяо Мина.
Эксплуатационные ограничения
- Максимальное время работы: 1 с
- Максимальная оперативная память: 128M
отвечать
public class Main {
public static void main(String[] args) {
for (int i = 2014; i > 1950; i--) {
if ((2014 - i) == (i % 10 + (i / 10) % 10 + (i / 100) % 10 + (i / 1000) % 10))
System.out.println(i);
}
}
}
Примечание: Определяем интервал (1950, 2014), результат 2006, 1988, он мой двоюродный брат, значит 2006 года рождения
Ответ: Я: 1988 г.р. Он: 2006 г.р.
тема вторая
Описание темы
треугольник игральных карт
Этот вопрос заполняет пустые поля.После вычисления результата используйте оператор вывода в коде, чтобы вывести заполненный результат.
A, 2, 3, 4, 5, 6, 7, 8, 9, всего 9 карт расположены в правильном треугольнике (A считается за 1). Сумма каждой стороны должна быть равна. На рисунке ниже представлена аранжировка.
Таких договоренностей может быть много.
Если рассматривать вращение и зеркальное отображение (симметрию), одно и то же одно и то же, сколько существует различных схем?
Пожалуйста, рассчитайте и отправьте это число.
Эксплуатационные ограничения
- Максимальное время работы: 1 с
- Максимальная оперативная память: 256M
отвечать
public class Main {
static int ans = 0;
static int[] A = new int[9];// 用来存数据
static int[] B = new int[9];// 用来表示该数组的位置是否有被遍历过
public static void main(String[] args) {
dfs(0);
// 因为旋转和镜像代表的是同一种,但是它们各重复三次,即重复六次,所以最后要除以六
System.out.println(ans / 6);
}
public static void dfs(int num) {
if (num == 9 && ((A[0] + A[1] + A[2] + A[3]) == (A[3] + A[4] + A[5] + A[6]))
&& ((A[3] + A[4] + A[5] + A[6]) == (A[6] + A[7] + A[8] + A[0]))) {
ans++;
return;
}
for (int i = 0; i < 9; i++) {
if (B[i] == 0) {
A[num] = i + 1;// 对数组进行赋值
B[i] = 1;// 表示该位置已经赋值
dfs(num + 1);
B[i] = 0;// 回溯
}
}
}
}
Примечание: поиск dfs, полное расположение и понимание трех элементов являются наиболее важными.
- Настройки параметров ввода
- экспорт настроек для dfs
- Требуется ли откат
Ответ: 144
тема три
Описание темы
игра в мяч
В коробке n шаров. А и В по очереди берут шары из коробки. Каждый может видеть, сколько мячей взял другой и сколько осталось в коробке. Все они умные и не ошибаются суждения.
Мы согласны:
Количество шаров, которые каждый игрок берет из коробки, должно быть: 1, 3, 7 или 8. Ты не можешь воздержаться, когда твоя очередь брать мяч! А сначала берет мяч, а затем поочередно берет мяч, пока тот не закончится. Сторона, вынужденная получить последний мяч, является проигравшей (проигравшая сторона).
Пожалуйста, запрограммируйте, чтобы определить, может ли А выиграть с заданным начальным числом шаров так, чтобы ни одна из сторон не ошиблась?
введите описание
Первым является целое число n (n<100), что означает, что следующие n целых чисел.
Затем есть n целых чисел, каждое в строке (целое число < 10^4), представляющее начальное количество шаров.
выходное описание
Затем программа выводит n строк, указывающих, выигрывает или проигрывает А (0 — проигрыш, 1 — выигрыш).
входная выборка
4 1 2 10 18
Пример вывода
0 1 1 0
Эксплуатационные ограничения
- Максимальное время работы: 1 с
- Максимальная оперативная память: 256M
отвечать
(насильственное решение)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//类似于爬楼梯的递归模式
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
List<Integer> l = new ArrayList<>();
for (int i = 0; i < n; i++) {
l.add(scanner.nextInt());
}
for (int j = 0; j < n; j++) {
if (A(l.get(j))) {
System.out.println(1);
} else {
System.out.println(0);
}
}
}
public static boolean A(int m) {
if (m >= 1) {
switch (m) {
case 1:
return false;// 当你要去拿球时,并且最后只剩下1个球时,输
case 3:
return false;// 当你要去拿球时,并且最后只剩下3个球时,输
case 7:
return false;// 输
case 8:
return true;// 赢
default:
return (!A(m - 1) || !A(m - 3) || !A(m - 7) || !A(m - 8));// 这个时候表示自己拿1或3或7或8个球,然后这时对象变成了对面的一个人,所以要加!
}
}
return false;
}
}
(дп решить)
import java.util.Scanner;
//dp解法
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
boolean[] A = new boolean[10009];// 因为n<10^4
A[0] = true;
for (int i = 1; i < 10009; i++) {
A[i] = (!(A[i - 1]) || (i >= 3 && !A[i - 3]) || (i >= 7 && !A[i - 7]) || (i >= 8 && !A[i - 8]));// 这个时候表示自己拿1或3或7或8个球,然后这时对象变成了对面的一个人,所以要加!
}
// 为了方便输出
int[] B = new int[n + 1];
for (int i = 1; i <= n; i++) {
int j = scanner.nextInt();
if (!A[j]) {
B[i] = 0;
} else {
B[i] = 1;
}
}
for (int k = 1; k <= n; k++) {
System.out.println(B[k]);
}
}
}
Насильственное решение: избыточный код, высокая частота повторения, громоздкость и громоздкость
решение dp: есть только два результата, он выигрывает или я выигрываю, отношения между правильным и неправильным, используйте «||» для выбора четырех методов, что означает, что пока есть один метод для победы, тогда я выиграю в конец, а метод является оптимальным значением.
например: 4 мяча
1, 1, 1, 1 (я проиграл)
3, 1 (я выиграл)
Просматривайте результаты вычислений и накапливайте их