Задача A

Условие (кратко):
(a+c) принадлежит (b+c)
Вводные данные : a b
Найти: c
Рассуждение:
-
Если нам надо найти (a+c) принадлежащее (b+c) , нам надо работать со строками.
-
Как найти c?
На ум приходит 2 варианта.
1. Генерировать кандидитов C (через цикл или отдельно выделенный массив)
2. Использовать алгоритм для поиска подстроки
3. Использовать RegExТак давайте же комбинировать наши идеи.
Чтобы решить задачу мы можем:
1. Скомбинировать 1 и 2
2. Скомбинировать 1 и 3
-
У нас олимпиада , так что времени в обрез , поэтому зачем мучать себя алгоритмом поиска подстроки , если велосипед придумали до тебя.
Решение(так , как я джавист все решения будут предоставлены на java):
```
import java.util.Scanner;
import java.math.BigInteger;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// я выбрал именно тип BigInteger ибо числа могут быть запредельно большими для int
BigInteger a = new BigInteger(scanner.next());
BigInteger b = new BigInteger(scanner.next());
scanner.close();
boolean found = false; // делаем флажочек , это так как я их называю для того чтобы выводить -1
for (int len = 0; len <= 5; len++) {
int limit = (int) Math.pow(10, len);
for (int c = 0; c < limit; c++) { // генерируем кандидатов , как я и говорил
BigInteger C = BigInteger.valueOf(c);
String x = a.add(C).toString();
String y = b.add(C).toString();
Pattern pattern = Pattern.compile(Pattern.quote(x)); // создаем pattern по которому будет происходиться поиск , в данном случае у нас это a , то есть переменная x
Matcher matcher = pattern.matcher(y);
if (matcher.find()) { // ищем по pattern через обьект matcher
System.out.println(c); // если нашло печатает
found = true; // если нашло в 40 строке кода -1 не напечатает
return; // выходит из функции
}
}
}
if (!found) {
System.out.println(-1);
}
}
}
Задача B

Условие(кратко):
Вводные данные:
n k
a1 a2 a3 a4 .. ai
q
[1 or 2 or 3] if 1 ix if 2 l r if 3 l r
Выход:
Для каждого 3 типа запроса вывести результат , то есть сумму в которую обойдутся вам все товары.
Рассуждения:
Надо спарсить данные
Составить таблицу с номером_тороговца : цена_уник_товара
-
По сформированной таблице запросов:
Если нам прилетел 1 , то просто приравниваем к таблице торговцев цену товара
Если прилетел 2 , то инвертируем с l по r цены у торговцев. С l по R это номер торговца.
Если прилетел 3 выводим сумму
Решение
import java.util.HashMap;
import java.util.Scanner;
public class B_Solution {
private final HashMap<Integer, Integer> traders = new HashMap<>();
private int k;
public void solve() {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
k = sc.nextInt();
for (int i = 1; i <= n; i++) {
int p = sc.nextInt();
traders.put(i, p);
}
int q = sc.nextInt();
for (int qi = 0; qi < q; qi++) {
int type = sc.nextInt();
int l = sc.nextInt();
int r = sc.nextInt();
if (type == 1) {
traders.put(l, r);
} else if (type == 2) {
for (int i = l; i <= r; i++) {
int v = traders.get(i);
traders.put(i, invert(v, k));
}
} else if (type == 3) {
int sum = 0;
for (int i = l; i <= r; i++) {
sum += traders.get(i);
}
System.out.println(sum);
}
}
sc.close();
}
public static int invert(int x, int k) {
int mask = (1 << k) - 1;
return (~x) & mask;
}
public static void main(String[] args) {
new B_Solution().solve();
}
}
ПС: Да , я знаю ,что вместо regex можно было использовать contains. А вместе hashmap просто массив ,но я выкладываю нерациональные решения , которые я сделал в стрессе. Ибо так вы можете поразмышлять , как можно было бы сделать лучше. И начать думать и понять мое решение получше.