Я не понимаю, почему мой для l oop дает неловкий вывод - PullRequest
0 голосов
/ 07 апреля 2020

к сожалению ... я вчера спросил именно об этом вопросе о другой ошибке, надеюсь, у меня больше нет этих ошибок, но у меня все еще есть этот неуклюжий вывод, например, какие-то числа в зависимости от элемента массива, такие как -4221565 или -4647963, и т. Д. c ... До сих пор я думаю, что моя часть добавления массива работает правильно, я пробовал это. Но я думаю, что-то не так с -1 в условии, но я не могу назвать это. Для l oop это еще одно место, я бы сказал, хорошо. Я пытаюсь решить эту проблему с 3.00 утра, потом откладываю, потом пробовал ... И крайний срок - 7.04.2020 (СЕГОДНЯ) 22.00, поэтому я начинаю сходить с ума. Любая помощь будет принята. Спасибо. Так что это вопрос (входные данные не должны быть 15, это может быть до 15):

Вы должны транспортировать максимум 15 различных грузов из одного порта в другой , Грузоподъемность корабля go, который будет перевозить эти грузы, составляет 50 тонн. Грузы перечисляются, и информация о весе каждой нагрузки дается в качестве ввода.

Предположим, что вес каждой нагрузки меньше или равен 50 тоннам и больше 0.

Вы будет читать вес каждой нагрузки от входа в одной строке. Ваш ввод закончится -1. Вы напечатаете количество необходимых поездок.

Пример ввода:

50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 -1

Выход: 15

Вход: 20 25 25 36 37 25 20 10 50 9 16 45 32 10 25 -1

Выход: 11

Вход: 14 16 50 10 10 19 45 40 32 24 25 47 10 12 25 -1

Выход: 9

Вход: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -1

Выход : 3

Вот мой код:

#include <stdio.h>
int main()
{   int w,i,sum,index;
    int list[15];
    w = 1;
    index = 0;
    do
    {   scanf("%d",&w);
        list[index] = w;
        index++;
    }while(w != -1);
    sum = 0;
    for(i = 0;i < 15;i++)
    {
        sum +=list[i];
    }
        sum = sum / 50;
        printf("%d",sum);
    return 0;

}

Ответы [ 4 ]

1 голос
/ 07 апреля 2020

в вашем коде вы пересекаете границы массива -1 будет 16-м элементом массива, что неверно. вам нужно по крайней мере int list[16];.

, но ваше решение неверно, вы распределяете нагрузки, чтобы разместить их на корабле go, судя по заданным входным и выходным данным. например, если на одном корабле 30 и 10, вы не можете разделить нагрузку 20 на две 10 нагрузок, чтобы разместить на судне максимум 50 тонн.

что вам нужно:

  1. рассмотрим корабль с 0 тонна

  2. добавить нагрузку к нему, в то время как сумма нагрузки ниже или равна 50

  3. , если с новой нагрузкой сумма текущего корабля поднимается выше 50 counter_ship++, а затем добавляется эта нагрузка к новой нагрузке.

int main(void) {
    int w;
    int sum = 0;
    int ship_counter = 0;
    scanf("%d", &w);

    while (w != -1) {
        if (sum + w > 50)
        {
            ship_counter++;
            sum = 0;
        }
        sum += w; 
        scanf("%d", &w);
    }
    if (sum != 50)
        ship_counter++;
    printf("%d", ship_counter);

    return 0;
}  

0 голосов
/ 07 апреля 2020

Измените do-while l oop на какое-то время так:

while(w != -1 && index < 15)
{   scanf("%d",&w);
    list[index] = w;
    index++;
}

Таким образом вы избежите записи за пределы массива.

Тогда условие для l oop может быть:

for(i = 0;i < index; i++)

(значение индекса взято из предыдущего l oop, и это только до следующего элемента из последнего вставленного). Итак, вы суммируете элементы, которые на самом деле имели входные данные, а не весь массив.

Конечно, вы можете обойтись без массива, как прокомментировали другие.

Надеюсь, что это поможет

0 голосов
/ 07 апреля 2020

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

#include <stdio.h>
void swap(int* xp, int* yp) 
{ 
    int temp = *xp; 
    *xp = *yp; 
    *yp = temp; 
} 

// Function to perform Selection Sort 
void selectionSort(int arr[], int n) 
{ 
    int i, j, min_idx; 

    // One by one move boundary of unsorted subarray 
    for (i = 0; i < n - 2; i++) { 

        // Find the minimum element in unsorted array 
        min_idx = i; 
        for (j = i + 1; j < n-1; j++) 
            if (arr[j] < arr[min_idx]) 
                min_idx = j; 

        // Swap the found minimum element 
        // with the first element 
        swap(&arr[min_idx], &arr[i]); 
    } 
} 

int main()
{   int w,i,sum,index;
    int list[15];
    w = 1;
    index = 0;
    do
    {   scanf("%d",&w);
        list[index] = w;
        index++;
    }while(w != -1);

    selectionSort(list,index);

    for (int i = 0; i < index; i++) 
        printf("%d ", list[i]); 
    printf("\n"); 

    int ans=0;
    int threshold=0;
    for(int i=0; i<index; ++i){
        if(threshold + list[i]<=50){
            threshold+=list[i];
        }
        else {
            threshold = list[i];
            ++ans;
        }
    }
    ans++;
    printf("%d", ans);
    return 0;

}
0 голосов
/ 07 апреля 2020

В вашем коде есть несколько проблем, и я не чувствовал себя хорошо, чтобы улучшить то, что все еще содержит в себе логические проблемы, поэтому я делаю то, что обычно не делаю (потому что, очевидно, вы, кажется, очень обеспокоены этим, и вы в спешите) и предоставлю вам мою собственную версию того, как я выполнил задачу:

#include <stdio.h>

#define MAX_LOADS 15
#define MAX_CAP 50

int main()
{
    int w[MAX_LOADS+1];
    int trips = 0;
    int i = 0;
    int sum = 0;
    int max = 0;
    int loads = 0;
    int rest = 0;

    printf("Enter the Weights of the Loads:\n");    

    while(i < (MAX_LOADS + 1))
    {
        scanf(" %d",&w[i]);
        printf(" ");
        if(w[i] == -1)
        {
            break;
        }
        sum = sum + w[i];

        loads++;
        i++;
    }

    printf("\n");

    printf("%d Loads have a weight of %d tons.\n", loads, sum);

    if(sum <= MAX_CAP)
    {
         printf("The amount of needed trips are: 1");
    }
    else
    {
         for(int i = 0; i < loads; i++)
         {
             if(w[i] == MAX_CAP)
             {
                 w[i] = 0;
                 trips++;
                 continue; 
             }
             else if(w[i] < MAX_CAP && w[i] > 0)
             {
                 rest = MAX_CAP - w[i];
                 w[i] = 0;

                 for(int j = 0; j < loads; j++)
                 {
                     if(i == j)
                     continue;

                     if(w[j] == rest)
                     {
                        w[j] = 0;
                        break;
                     }
                     else if(w[j] < rest && w[j] > 0)
                     {
                        rest = rest - w[j];
                        w[j] = 0;
                     } 

                     if(rest == 0)
                     {
                        break;
                     }
                 } 

                 trips++;
             }
         }

         printf("The amount of needed trips are: %d", trips);
    }

    return 0;    
}

Вывод / выполнение 1:

Enter the Weights of the Loads:    
10 20 40 -1                    

3 Loads have a weight of 70 tons.
The amount of needed trips are: 2

Вывод / выполнение 2:

Enter the Weights of the Loads:          
50 50 50 50 50 -1   

5 Loads have a weight of 250 tons.              
The amount of needed trips are: 5

Вывод / исполнение 3:

Enter the Weights of the Loads:  
10 10 10 10 10 -1   

5 Loads have a weight of 50 tons.                               
The amount of needed trips are: 1 
...