Advertisement
THOMAS_SHELBY_18

lesson02

Feb 27th, 2024
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.49 KB | Source Code | 0 0
  1. package by.it.group351004.narivonchik.lesson02;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.List;
  6. /*
  7. Даны события events
  8. реализуйте метод calcStartTimes, так, чтобы число включений регистратора на
  9. заданный период времени (1) было минимальным, а все события events
  10. были зарегистрированы.
  11. Алгоритм жадный. Для реализации обдумайте надежный шаг.
  12. */
  13.  
  14. public class A_VideoRegistrator {
  15.     public static void main(String[] args) {
  16.         A_VideoRegistrator instance = new A_VideoRegistrator();
  17.         double[] events = new double[]{1, 1.1, 1.6, 2.2, 2.4, 2.7, 3.9, 8.1, 9.1, 5.5, 3.7};
  18.         List<Double> starts = instance.calcStartTimes(events,1);
  19.         System.out.println(starts);
  20.     }
  21.  
  22.     List<Double> calcStartTimes(double[] events, double workDuration){
  23.         List<Double> result;
  24.         result = new ArrayList<>();
  25.         double startTime;
  26.  
  27.         Arrays.sort(events);
  28.  
  29.         startTime = events[0];
  30.         result.add(startTime);
  31.  
  32.         for (int i = 1; i < events.length; i++) {
  33.             if (events[i] > startTime + workDuration) {
  34.                 startTime = events[i];
  35.                 result.add(startTime);
  36.             }
  37.         }
  38.         return result;
  39.     }
  40. }
  41.  
  42.  
  43.  
  44.  
  45.  
  46. package by.it.group351004.narivonchik.lesson02;
  47.  
  48. import java.util.ArrayList;
  49. import java.util.Arrays;
  50. import java.util.List;
  51. /*
  52. Даны интервальные события events
  53. реализуйте метод calcStartTimes, так, чтобы число принятых к выполнению
  54. непересекающихся событий было максимально.
  55. Алгоритм жадный. Для реализации обдумайте надежный шаг.
  56. */
  57.  
  58. public class B_Sheduler {
  59.     //событие у аудитории(два поля: начало и конец)
  60.     static class Event implements Comparable<Event>{
  61.         int start;
  62.         int stop;
  63.  
  64.         Event(int start, int stop) {
  65.             this.start = start;
  66.             this.stop = stop;
  67.         }
  68.  
  69.         @Override
  70.         public String toString() {
  71.             return "("+ start +":" + stop + ")";
  72.         }
  73.         @Override
  74.         public int compareTo(Event o) {
  75.             return this.stop - o.stop;
  76.         }
  77.     }
  78.  
  79.     public static void main(String[] args) {
  80.         B_Sheduler instance = new B_Sheduler();
  81.         Event[] events = {  new Event(0, 3),  new Event(0, 1), new Event(1, 2), new Event(3, 5),
  82.                 new Event(1, 3),  new Event(1, 3), new Event(1, 3), new Event(3, 6),
  83.                 new Event(2, 7),  new Event(2, 3), new Event(2, 7), new Event(7, 9),
  84.                 new Event(3, 5),  new Event(2, 4), new Event(2, 3), new Event(3, 7),
  85.                 new Event(4, 5),  new Event(6, 7), new Event(6, 9), new Event(7, 9),
  86.                 new Event(8, 9),  new Event(4, 6), new Event(8, 10), new Event(7, 10)
  87.         };
  88.  
  89.         List<Event> starts = instance.calcStartTimes(events,0,10);  //рассчитаем оптимальное заполнение аудитории
  90.         System.out.println(starts);                                 //покажем рассчитанный график занятий
  91.     }
  92.     List<Event> calcStartTimes(Event[] events, int from, int to) {
  93.         //Events - события которые нужно распределить в аудитории
  94.         //в период [from, int] (включительно).
  95.         //оптимизация проводится по наибольшему числу непересекающихся событий.
  96.         //Начало и конец событий могут совпадать.
  97.         List<Event> result;
  98.         result = new ArrayList<>();
  99.         double stopTime;
  100.  
  101.         Arrays.sort(events);
  102.  
  103.         result.add(events[0]);
  104.         stopTime = events[0].stop;
  105.  
  106.         int firstEventInRange = 0;
  107.         while (events[0].start < from) {
  108.             firstEventInRange++;
  109.         }
  110.  
  111.         for (int i = firstEventInRange; (i < events.length) && (stopTime <= to); i++){
  112.             if (events[i].start >= stopTime){
  113.                 result.add(events[i]);
  114.                 stopTime = events[i].stop;
  115.             }
  116.         }
  117.         return result;
  118.     }
  119. }
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126. package by.it.group351004.narivonchik.lesson02;
  127. /*
  128. Даны
  129. 1) объем рюкзака 4
  130. 2) число возможных предметов 60
  131. 3) сам набор предметов
  132.     100 50
  133.     120 30
  134.     100 50
  135. Все это указано в файле (by/it/a_khmelev/lesson02/greedyKnapsack.txt)
  136.  
  137. Необходимо собрать наиболее дорогой вариант рюкзака для этого объема
  138. Предметы можно резать на кусочки (т.е. алгоритм будет жадным)
  139.  */
  140. import java.io.File;
  141. import java.io.FileNotFoundException;
  142. import java.util.Arrays;
  143. import java.util.Scanner;
  144.  
  145. public class C_GreedyKnapsack {
  146.     private static class Item implements Comparable<Item> {
  147.         int cost;
  148.         int weight;
  149.  
  150.         Item(int cost, int weight) {
  151.             this.cost = cost;
  152.             this.weight = weight;
  153.         }
  154.  
  155.         @Override
  156.         public String toString() {
  157.             return "Item{" +
  158.                     "cost=" + cost +
  159.                     ", weight=" + weight +
  160.                     '}';
  161.         }
  162.  
  163.         @Override
  164.         public int compareTo(Item o) {
  165.             return this.cost/this.weight - o.cost/o.weight;
  166.         }
  167.     }
  168.  
  169.     double calc(File source) throws FileNotFoundException {
  170.         Scanner input = new Scanner(source);
  171.         int n = input.nextInt();      //сколько предметов в файле
  172.         int W = input.nextInt();      //какой вес у рюкзака
  173.         Item[] items = new Item[n];   //получим список предметов
  174.         for (int i = 0; i < n; i++) { //создавая каждый конструктором
  175.             items[i] = new Item(input.nextInt(), input.nextInt());
  176.         }
  177.         //покажем предметы
  178.         for (Item item:items) {
  179.             System.out.println(item);
  180.         }
  181.         System.out.printf("Всего предметов: %d. Рюкзак вмещает %d кг.\n",n,W);
  182.  
  183.         //решение
  184.         Arrays.sort(items);
  185.  
  186.         double result = 0;
  187.         int nowCommonWeight = 0;
  188.         int i;
  189.         for (i = items.length - 1; (i > 0) && (nowCommonWeight <= W); i--) {
  190.             result += items[i].cost;
  191.             nowCommonWeight += items[i].weight;
  192.         }
  193.         result -= items[i].cost;
  194.         result += (double)(W - (nowCommonWeight - items[i].weight)) * items[i].cost/items[i].weight;
  195.  
  196.         System.out.printf("Удалось собрать рюкзак на сумму %f\n",result);
  197.         return result;
  198.     }
  199.     public static void main(String[] args) throws FileNotFoundException {
  200.         long startTime = System.currentTimeMillis();
  201.         String root=System.getProperty("user.dir")+"/src/";
  202.         File f=new File(root+"by/it/a_khmelev/lesson02/greedyKnapsack.txt");
  203.         double costFinal=new C_GreedyKnapsack().calc(f);
  204.         long finishTime = System.currentTimeMillis();
  205.         System.out.printf("Общая стоимость %f (время %d)",costFinal,finishTime - startTime);
  206.     }
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement