• Переписать программу с Java на Pascal, СРОЧНО, 50 баллов
    import java.util.*;
    import java.io.*;

    public class sol_ik {

    private final int UNIT = 1000;
    private final int DISCOUNT_PER_UNIT = 500;
    private final double MAX_DISCOUNT = 0.2;

    private double getTotalCost(long firstCost, long secondCost,
    long fullUnits) {
    long couponSum = fullUnits * DISCOUNT_PER_UNIT;
    double secondCostWithDiscount = secondCost
    - Math.min(MAX_DISCOUNT * secondCost, couponSum);
    return firstCost + secondCostWithDiscount;
    }

    long[] solveKnapsack(long[] weights, long totalWeight) {
    int maxUnits = (int) (totalWeight / UNIT + 1);
    long[] old = new long[maxUnits + 1];
    Arrays.fill(old, totalWeight);
    old[0] = 0;
    long[] cur = new long[maxUnits + 1];
    int n = weights.length;
    for (int pos = 0; pos < n; pos++) {
    Arrays.fill(cur, totalWeight);
    for (int units = 0; units <= maxUnits; units++) {
    cur[units] = Math.min(cur[units], old[units]);
    int add = (int) weights[pos] / UNIT;
    if (units - add >= 0) {
    cur[units] = Math.min(cur[units],
    old[units - add] + weights[pos]);
    }
    }
    System.arraycopy(cur, 0, old, 0, cur.length);
    }
    return old;
    }

    public double getSolution(long[] costs) {
    int n = costs.length;
    long totalCost = 0;
    for (int i = 0; i < n; i++) {
    totalCost += costs[i];
    }
    long[] minForUnits = solveKnapsack(costs, totalCost);
    double res = totalCost;
    long maxUnits = totalCost / UNIT + 1;
    for (int units = 0; units <= maxUnits; units++) {
    double cur = minForUnits[units];
    res = Math.min(res,
    getTotalCost(minForUnits[units],
    totalCost - minForUnits[units],
    units));
    }
    return res;
    }

    public void solve(Scanner in, PrintWriter out) {
    int n = in.nextInt();
    long[] costs = new long[n];
    for (int i = 0; i < n; i++) {
    costs[i] = in.nextInt();
    }
    out.printf("%.2f%n", getSolution(costs));
    }

    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    PrintWriter out = new PrintWriter(System.out);
    new sol_ik().solve(in, out);
    out.flush();
    }
    }

Ответы 8

  • Вы можете это переписать ведь?
  • Могу, но только если: 1) пойму структуру входных данных 2) получу эти данные для тестирования, чтобы пропустить их на Java , а затем на Паскале и сравнить результаты.
    • Автор:

      lucastwf4
    • 6 лет назад
    • 0
  • Я могу вам скинуть пару тестов и ответы для них
    • Автор:

      jerry
    • 6 лет назад
    • 0
  • Либо, что проще, надо постановку задачи, послать эту программу куда подальше и написать с нуля в Паскале.
    • Автор:

      marcos
    • 6 лет назад
    • 0
  • Вы напишите?
  • Выполнено фактически прямое портирование текста программы за исключением "экзотики" языка Java, поэтому программа получилась короче.
  • скачай нужный файл.Потом перекинь на папку.
  • // PascalABC.NET 3.3, сборка 1607 от 31.12.2017// Внимание! Если программа не работает, обновите версию!const  cunit=1000;  DISCOUNT_PER_UNIT=500;  MAX_DISCOUNT=0.2;function getTotalCost(firstCost,secondCost,fullUnits:real):real;begin  var couponSum:=fullUnits*DISCOUNT_PER_UNIT;    var secondCostWithDiscount:=        secondCost-Min(MAX_DISCOUNT*secondCost,couponSum);    Result:=firstCost+secondCostWithDiscountend;function solveKnapsack(weights:array of integer; totalWeight:integer):    array of integer;begin    var maxUnits:=Trunc(totalWeight/cunit+1);    var old:=ArrFill(maxUnits+1,totalWeight);    old[0]:=0;    var cur:=new integer[maxUnits+1];    var n:=weights.Length;    for var pos:=0 to n-1 do begin        cur.Fill(t->totalWeight);        for var units:=0 to maxUnits do begin            cur[units]:=Min(cur[units],old[units]);            var add:=Trunc(weights[pos]/cunit);            if units-add >= 0 then                cur[units]:=Min(cur[units],old[units-add]+weights[pos])            end;            cur.CopyTo(old,0);        end;    Result:=old;    end;function getSolution(costs:array of integer):real;begin  var n:=costs.Length;    var totalCost:=0;    for var i:=0 to n-1 do totalCost+=costs[i];    var minForUnits:=solveKnapsack(costs,totalCost);    Result:=totalCost;    var maxUnits:=Trunc(totalCost/cunit+1);    for var units:=0 to maxUnits do begin      var cur:real:=minForUnits[units];        Result:=Min(Result,getTotalCost(minForUnits[units],totalCost-cur,units))      endend;begin  Writeln(getSolution(ReadArrInteger(ReadInteger)):0:2)end.Пример151131 2764 1249 3885 4971 2526 1506 1919 520 3094 2183 2503 277 2293 447730415.40
    answer img
  • Добавить свой ответ

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years