При использовании суммирующего ряда желаемый результат изменяется.
Проблема в:
У Лили есть плитка шоколада, которой она хочет поделиться с Роном на его день рождения. На каждом квадрате есть целое число. Она решает разделить непрерывный сегмент выбранной полосы таким образом, чтобы длина сегмента соответствовала месяцу рождения Рона, а сумма целых чисел в квадратах была равна его дню рождения. Вы должны определить, сколькими способами она может разделить шоколад.
Рассмотрим плитку шоколада как массив квадратов s=2,2,1,3,2
. Она хочет найти отрезки, суммирующие день рождения Рона, d=4
с длиной, равной месяцу его рождения, m=2
. В этом случае есть два сегмента, соответствующих ее критериям: 2,2
и 3,1
.
Описание функции
Завершите функцию дня рождения в редакторе ниже. Он должен вернуть целое число, обозначающее количество способов, которыми Лили может разделить плитку шоколада.
День рождения имеет следующие параметры:
s
: массив целых чисел, числа на каждом из шоколадных квадратов
d
: целое число, день рождения Рона
m
: целое число, месяц рождения Рона
Формат ввода
В первой строке записано целое число n - количество квадратов в плитке шоколада. Во второй строке через пробел записаны целые числа s[I]
, числа на шоколадных квадратах где. Третья строка содержит два целых числа, разделенных пробелами, m
и d
, день рождения Рона и месяц его рождения.
Выходной формат
Выведите целое число, обозначающее общее количество способов, которыми Лили может разделить свою плитку шоколада и поделиться ею с Роном.
Пример ввода 0
5
1 2 1 3 2
3 2
Пример вывода 0
2
И мой код на java
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import java.util.Scanner;
public class Solution {
public static void main(String args[])
{
int a[] = new int[1000];
Scanner s=new Scanner(System.in);
int sum=0,count=0;
int n=s.nextInt();
for(int i=0;i<n;i++)
{
a[i]=s.nextInt();
}
int m=s.nextInt();
int d=s.nextInt();
for(int i=0;i<n;i++){
for(int j=i;j<d+i;j++)
{
sum=sum+a[j];
if(sum==m)
{
count++;
}
}sum=0;
}
System.out.println(count);
}}
Я получаю 3 вместо 2. Как подвести итоги до d
сроков?
2 ответа
В вашем алгоритме (показанном ниже) вы проверяете сумму до завершения внутреннего цикла:
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import java.util.Scanner;
public class Solution {
public static void main(String args[])
{
int a[] = new int[1000];
Scanner s=new Scanner(System.in);
int sum=0,count=0;
int n=s.nextInt();
for(int i=0;i<n;i++)
{
a[i]=s.nextInt();
}
int m=s.nextInt();
int d=s.nextInt();
for(int i=0;i<n;i++){
for(int j=i;j<d+i;j++)
{
sum=sum+a[j];
//THIS CHECK SHOULD BE OUTSIDE THE CURRENT FOR LOOP
if(sum==m)
{
count++;
}
}sum=0;
}
System.out.println(count);
}}
Вы должны делать это так,
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import java.util.Scanner;
public class Solution {
public static void main(String args[])
{
int a[] = new int[1000];
Scanner s=new Scanner(System.in);
int sum=0,count=0;
int n=s.nextInt();
for(int i=0;i<n;i++)
{
a[i]=s.nextInt();
}
int m=s.nextInt();
int d=s.nextInt();
for(int i=0;i<n;i++){
for(int j=i;j<d+i;j++)
{
sum=sum+a[j];
}
if(sum==m)
{
count++;
}
sum=0;
}
System.out.println(count);
}}
Однако даже в приведенном выше решении отсутствует крайний случай. Вы инициализируете свой массив с именем a как массив длиной 1000, который внесет ошибки в ваш код. Например, рассмотрим следующий ввод
5
1 2 1 3 2
2 2
Теперь, поскольку ваш массив a выглядит примерно так:
1 2 1 3 2 0 0 0 0 ... //till length 1000
Ваш алгоритм даст следующий ответ как действительный. когда на самом деле их нет:
1 2 1 3 [2 0] 0 0 0 ... //till length 1000
Таким образом, ваш внешний цикл for должен идти только до (n-d) -го элемента
Попробуйте это,
//n - amount of bars
//s - array of bars (s[i] - weight of each bar)
//d - Ron's birthday
//m - Ron's birthmonth
int answer = 0;
// iterate bars
for (int k = 0; k < s.length; k += 1) {
int sum = 0;
// iterate bars month times
for (int j = i; j < m + i; j += 1) {
// count sum of weights month times
sum += s[j];
}
// if counted sum is equal to amount of days
// then it's +1 to possible ways!
if (sum == d) {
answer += 1;
}
}
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].