Решение математической задачи «Мишка и путешествие» - C#

Узнай цену своей работы

Формулировка задачи:

Маленькая Мишка — большая путешественница. В каких только странах она не побывала! После долгих раздумий о том, куда бы поехать в этом году, выбор её пал на XXX — прекрасную, но малоизвестную северную страну. Вот несколько интересных фактов об этой стране: В состав XXX входят n городов, k из которых (только представьте себе!) являются столицами. Все города этой страны красивы, но по-разному. Красота i-го города описывается величиной ci. Все города последовательно соединены дорогами, включая 1-й и n-й город, образуя замкнутый маршрут 1 — 2 — ... — n — 1. Формально, для каждого 1 ≤ i < n существует дорога между городами i и i + 1, и еще одна между городами 1 и n. Каждый город-столица напрямую соединен дорогами со всеми остальными городами. Формально, если город x — столица, то для каждого 1 ≤ i ≤ n,  i ≠ x, существует дорога между городами x и i. Между любыми двумя городами существует не более одной дороги. Стоимость проезда между городами напрямую зависит от показателей их красоты. Так, если между городами i и j существует дорога, то стоимость проезда по ней равна ci·cj. Мишка уже начала собираться в путешествие, но ещё не определилась со своим маршрутом, а потому попросила вас помочь ей оценить суммарную стоимость проезда по всем дорогам XXX. Формально, по всем различным парам городов a и b (a < b), таких, что a и b соединены дорогой, требуется посчитать сумму произведений ca·cb. Поможете ей?

Входные данные

В первой строке входных данных содержатся числа n и k (3 ≤ n ≤ 100 000, 1 ≤ k ≤ n) — количество городов в XXX и количество столиц среди них соответственно. Во второй строке содержится n целых чисел c1, c2, ..., cn (1 ≤ ci ≤ 10 000) — показатели красоты каждого из городов. В третьей строке содержится k различных целых чисел id1, id2, ... idk (1 ≤ idi ≤ n) — номера городов, являющихся столицами. Номера городов заданы в порядке возрастания.

Выходные данные

Выведите единственное целое число — суммарную стоимость проезда по всем существующим дорогам в XXX.

Решение задачи: «Решение математической задачи «Мишка и путешествие»»

textual
Листинг программы
  1. import java.io.BufferedReader;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.util.ArrayList;
  7. import java.util.HashSet;
  8. import java.util.List;
  9. import java.util.Set;
  10. import java.util.StringTokenizer;
  11.  
  12.  
  13. public class Main {
  14.     public static void main(String[] args) throws IOException {
  15.         InputReader in = new InputReader(System.in);
  16.         //InputReader in = new InputReader(new FileInputStream("input.txt"));
  17.         Task solver = new Task();
  18.         solver.solve(in);
  19.     }
  20. }
  21.  
  22.  
  23. class Task {
  24.     public static final int MAXN = 100003;
  25.  
  26.     public void solve(InputReader in) throws IOException {
  27.         int n = in.readInt();
  28.         int k = in.readInt();
  29.         long[] beauty = new long[MAXN];
  30.         long beautySum = 0;
  31.         for (int i = 0; i < n; ++i) {
  32.             beauty[i] = in.readLong();
  33.             beautySum += beauty[i];
  34.         }
  35.         long cost = 0;
  36.         Set<Integer> caps = new HashSet<>();
  37.         while (k-- > 0) {
  38.             int cap = in.readInt() - 1;
  39.             cost += beauty[cap] * (beautySum - beauty[cap]);
  40.             beautySum -= beauty[cap];
  41.             caps.add(cap);
  42.  
  43.         }
  44.         for (int i = 0, j = 1; i < n; ++i, j = (j + 1) % n) {
  45.             if (!caps.contains(i) && !caps.contains(j)) {
  46.                 cost += beauty[i] * beauty[j];
  47.             }
  48.         }
  49.         System.out.println(cost);
  50.  
  51.     }
  52. }
  53.  
  54.  
  55. class InputReader {
  56.     private BufferedReader reader;
  57.     private StringTokenizer tokenizer;
  58.  
  59.  
  60.     public InputReader(InputStream stream) {
  61.         reader = new BufferedReader(new InputStreamReader(stream), 32768);
  62.         tokenizer = null;
  63.     }
  64.  
  65.  
  66.     public String readLine() {
  67.         try {
  68.             return reader.readLine();
  69.         }
  70.         catch (IOException e) {
  71.             throw new RuntimeException(e);
  72.         }
  73.     }
  74.  
  75.  
  76.     public String readToken() {
  77.         while (tokenizer == null || !tokenizer.hasMoreTokens()) {
  78.             tokenizer = new StringTokenizer(readLine());
  79.         }
  80.         return tokenizer.nextToken();
  81.     }
  82.  
  83.  
  84.     public int readInt() {
  85.         return Integer.parseInt(readToken());
  86.     }
  87.  
  88.  
  89.     public long readLong() {
  90.         return Long.parseLong(readToken());
  91.     }
  92.  
  93.  
  94.     public double readDouble() {
  95.         return Double.parseDouble(readToken());
  96.     }
  97. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы