#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. Большое вам спасибо, вы дали мне лучшее решение моей проблемы.