Member 13924499 Ответов: 2

Как получить минимальное количество пицц?


Там есть ребенок, который устраивает свой день рождения, поэтому он приглашает своих друзей хорошо провести время, и он подает пиццу. Поэтому друзья ребенка очень раздражают, и они хотят только один кусочек, пусть это будет 1/2, 1/4 или 3/4 пиццы (все в одном гигантском ломтике), и ничего больше.

Поэтому я заказал запросы так, что если один ребенок хочет 1/2 пиццы, а другой тоже хочет 1/2 пиццы, то их кусочки будут складываться в дырочку пиццы. Это не передача войлока от одного ребенка к другому, это расположение кусочков так, чтобы они составляли пиццу с отверстиями и сохраняли свою часть как один кусок.

То же самое с ребенком, который хочет 3/4 и еще 1/4 и 4 ребенка, которые просят 1/4 пиццы каждый.

Если есть только дети, которые хотят 3/4 в качестве ломтика, то для них будут заказаны целые единицы пиццы, и один ломтик будет потерян для каждого, потому что, как я уже сказал, ломтики не сделаны из остатков.

Наконец - то именинник сам съест дырявую пиццу.

Вот что я получил


Источник: SPOJ.com - проблема EGYPIZZA[^]
#include <stdio.h>

#include <string.h>

void ask_input (float *);
int compare(float [], int );
int compare_string (char []);
int verify(float [], int);


int main(){

	int N, i;

	scanf("%d", &N);

	float amount[N];

	getchar();

	for (i=0; i < N; i++)
		ask_input(&amount[i]);
	
		printf("%d", compare(amount, N) + 1 );

}

void ask_input(float *amount){

	char c[3], m;


	switch(compare_string(c)){

		case 1: *amount = 0.5; break;

		case 2: *amount = 0.25; break;

		case 3: *amount = 0.75; break;

	}
		
}

int compare(float amount[], int N){

	int i,j,k, pizzas  = 0;

	for(i=0; i < N-1; i++)
		{
			for (j=i+1; j < N; j++)
			{
				if (amount[i] + amount[j] == 1.0)
					{
						amount[i] = 0;
						amount[j] = 0;
						pizzas++;
						break;
					}
				else if (amount[i] + amount[j] < 1.0)
					{
						for (k = j+1; (j < N-1) && (k < N) ; k++)
						{
						 if (amount[i] + amount[j] + amount[k] == 1.0)
							{
								amount[i] = 0;
								amount[j] = 0;
								amount[k] = 0;
								pizzas++;
								break;
							}	
						}
					}
			}
		}

		pizzas += verify(amount,N);


	return(pizzas);


}


int compare_string(char c[]){

	int i = 0, bandera = 1;

	char quarter[] = {'1','/','4'}, half[] = {'1','/','2'}, three_quarters[] = {'3','/', '4'}, m;

	while ( (m = getchar()) != '\n' && i < 3)
	{
		c[i] = m;
		i++;
	}

	i=0;


	while (i < 3)
	{

		if (c[i] != half[i])
			{
				bandera = 0;
				break;
			}
		i++;
	}

	if (bandera == 0)
		{
			bandera = 1, i=0;

			while (i < 3)
			{

				if (c[i] != quarter[i])
					{
						bandera = 0;
						break;
					}
				i++;
			}

			if (bandera == 0)

				return (3); // 3/4
			else 
				return (2); // 1/4

		}

	else return (1); // 1/2
}

int verify(float amount[], int N){

	int i, c_quarters= 0, c_half = 0, c_threeQuarters = 0, j = 0, k = 0, pizzas;

	for (i=0; i < N; i++)
	{
		if (amount[i] == 0.5)
			c_half++;

		if (amount[i] == 0.25)
			c_quarters++;

		if (amount[i] == 0.75)
			c_threeQuarters++;
	}

	pizzas = (c_half / 2) + (c_half % 2) + (c_quarters / 4) + c_threeQuarters;

	if(c_quarters % 4 != 0)
		pizzas++;


	c_half -= c_half % 2;

	c_quarters -= c_quarters % 4;



	for (i=0; i<N; i++)
	{
		if ( (amount[i] == 0.5) && (j < c_half) )
			{
				amount[i] = 0;
				j++;
			}

		if ( (amount[i] == 0.25) && (k < c_quarters) )
			{
				amount[i] = 0;
				k++;
			}
	}

	return (pizzas);
}


Что я уже пробовал:

Я пробовал пройти через любой тестовый случай

Ребенок, который хочет 3/4 и еще 1/4

1/2 и 1/2

4 дети, которые хотят 1/4

если есть более 4 детей которые хотят 1/4 то это число будет делится на 4 Как видно из вызова функции verify

Patrice T

"Трудности с этой проблемой" не информативны.

OriginalGriff

"Это не работает", вероятно, самый бесполезный отчет о проблеме, который мы получаем - и мы получаем его много. Она ничего не говорит нам о том, что происходит или когда это происходит. И это фактически то, что вы нам говорите.
Итак, расскажите нам, что он делает, чего вы не ожидали, или не делает, что вы сделали.
Расскажите нам, что вы сделали, чтобы это произошло.
Сообщайте нам о любых сообщениях об ошибках.
Расскажите нам, что должно делать приложение - не ссылайтесь на случайные сайты, которые выглядят как сокращатели ссылок, большинство из нас не будут приближаться к ним, и по уважительной причине.

Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Member 13924499

Эй, извините за наивную ошибку, это мой первый раз, когда я пользуюсь форумом. Понятно ли это улучшение?

2 Ответов

Рейтинг:
9

OriginalGriff

Начните с чтения всех необходимых размеров и сортировки их по размеру. Затем сопоставьте их: 3/4 ломтика с 1/4 ломтиками - они составляют целое, поэтому считайте их "одной пиццей" и удалите их. Если у вас осталось 3/4 пиццы, то у вас нет больше 1/4 пиццы, так что это еще одна пицца.
Сделайте то же самое с 1/2 пиццами, и вы получите либо одну, либо ноль 1/2 пиццы, а также несколько 1/4 пиццы. Если есть половина, удалите две 1/4 (если их так много), и это еще одна пицца.
Все, что осталось-это 1/4 пиццы, и вы можете сгруппировать их довольно легко!


Рейтинг:
1

Patrice T

Цитата:
Трудности с этой проблемой

Ваша проблема заключается в том, что вы можете иметь до 10000 ломтиков в 3 видах, и что вы сопоставляете эти ломтики 1 на 1, чтобы сделать полную пиццу.
Ты забыл использовать свой мозг!

Ваша задача-найти лучший метод. это действительно не сложно.

Кстати, Ваш код не обрабатывает пиццу размером 4 * 1/4.

[Обновление]
Иначе говоря, вам нужно проанализировать проблему.
Пример: ваш друг сказал вам, чего они хотят 1030*1/4 + 500*1/2 + 1000*3/4
Вам нужен точный список друзей, чтобы найти ответ ?
Может ли положение каждого фрагмента в списке изменить ответ ?
Вам нужно сопоставить кусочки 1 на 1 в списке ? или достаточно общего количества каждого вида ломтиков ?
Ответ на эти вопросы должен привести к решению гораздо быстрее и проще.