как найти количество страниц и количество строк на текущей странице в зависимости от скорости через указанный интервал времени?

#java #for-loop #if-statement #while-loop

#java #для цикла #if-оператор #цикл while

Вопрос:

Студент создал программное обеспечение, которое будет читать из одной книги и записывать в другую книгу . Обе книги могут иметь разные размеры. Программное обеспечение сначала полностью считывает из книги, а затем обрабатывает формат для записи в другую книгу. Ваша задача — определить через указанный промежуток времени, читает ли программное обеспечение или записывает. для каждого из этих действий необходимо указать, сколько операций чтения и записи произошло с точки зрения страницы и количества строк на текущей странице.

Ввод

 pn1 -> number of pages in first book 
ln1 -> number of lines per page in first book
pn2 -> number of pages in second book
ln2 -> number of lines per pages in second book
rs -> reading speed in lines/seconds
ws -> writing speed in lines/seconds
t -> time in seconds at which the result is to be processed
  

Вывод

 print current activity (READ or WRITE),page number and line number
  

Пример

 Input
100
10
500
6
8
4
145

Output
WRITE 13 2
  

Код :

 import java.util.*;

public class MyClass {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int pn1 = sc.nextInt();
        int ln1 = sc.nextInt();
        int pn2 = sc.nextInt();
        int ln2 = sc.nextInt();
        int rs = sc.nextInt();
        int ws = sc.nextInt();
        int t = sc.nextInt();
        int i,j,s1,s2,s3=0;
        s1 = pn1 * ln1;
        s2 = s1/rs;
        if(s2<t)
        {
            System.out.print("WRITE ");
            for(i=1;i<=pn2;i  )
            {
                for(j=1;j<=ln2;j=j ws)
                {
                    if(s2==t)
                    {
                        break;
                    }
                    s2  ;
                }
                if(j<=ln2)
                {
                    System.out.print(i  " "  j);
                    break;
                }
            }
        }
        else
        {
            System.out.print("READ ");
            for(i=1;i<=pn1;i  )
            {
                for(j=1;j<=ln1;j=j rs)
                {
                    if(s3==t)
                    {
                        break;
                    }
                    s3  ;
                }
                if(j<=ln1)
                {
                    System.out.print(i  " "  j);
                    break;
                }
            }
        }
    }
}
  

Мой вывод: ЗАПИСАТЬ 11 1

Может кто-нибудь, пожалуйста, помогите, где я ошибаюсь, потому что в моем операторе if else значение j не увеличивается, оно всегда будет печатать 1, поскольку оно будет инициализировано как 1 в цикле for . Спасибо заранее.

Комментарии:

1. Почему ответ для заданных данных WRITE 13 2 ? Для чтения 1000 строк первой книги требуется 125 секунд, за оставшиеся 20 секунд (145-125) 80 строк записываются со скоростью 6 строк / с, таким образом, 13 страниц полностью записаны, но текущий номер страницы равен 14.

Ответ №1:

Вычисления во вложенных циклах неверны, поскольку они не учитывают случай, когда страница не обрабатывается полностью в течение секунды.

Для входных данных процесс записи выглядит следующим образом:
сек. 1: всего строк 4: страница 1, строка 4 сек. 2: всего строк 8: страница 2, строка 2 сек. 3: всего строк 12: страница 2, строка 6 и т.д.

Таким образом, лучше иметь один цикл по параметру time и изменять информацию о странице / строке, используя операцию по модулю:

 if(s2<t) {
    for (int tt = s2   1; tt <= t; tt  ) {
        j  = ws;
        if (j >= ln2) {
            i  ;
            j = j % ln2;
        }
    }
    if (j == 0) { // correct page number if it's been completely written within a second
        i--;
        j = ln2;
    }
    System.out.print("WRITE "   i   " "   j);
} else { // fix reading in similar way
    for (int tt = 0; tt < t; tt  ) {
        j  = rs;
        if (j >= ln1) {
            i  ;
            j = j % ln1;
        }
    }
    if (j == 0) { // correct page number if it's been completely read within a second
        i--;
        j = ln1;
    }
    System.out.print("READ "   i   " "   j);
}
  

Эта задача также может быть решена без циклов с использованием арифметики по модулю и отдельной функции для определения текущей страницы и строки:

 // reusing all the variables defined in main 
int totalReadLines = pn1 * ln1;
int timeToRead = (int) Math.ceil(totalReadLines / rs);
if (t <= timeToRead) {
    printState("READ", totalReadLines, rs, t, ln1);
} else {
    t -= timeToRead;
    int totalWriteLines = pn2 * ln2;
    int timeToWrite = (int) Math.ceil(totalWriteLines / ws);
    if (t <= timeToWrite) {
        printState("WRITE", totalWriteLines, ws, t, ln2);
    } else {
        System.out.println("DONE");
    }
}
  
 private static void printState(String state, int totalLines, int speed, int time, int linesPerPage) {
    int linesProcessed = time * speed;
    int pagesProcessed = linesProcessed / linesPerPage;
        
    int remLines = linesProcessed % linesPerPage;
        
    int currentPage;
    int currentLine;
        
    if (remLines == 0) {
        currentPage = pagesProcessed;
        currentLine = linesPerPage;
    } else {
        currentPage = pagesProcessed   1;
        currentLine = remLines;
    }
    System.out.printf("%s %d %d%n", state, currentPage, currentLine);
}
  

Комментарии:

1. Большое вам спасибо, вы дали мне лучшее решение моей проблемы.