IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Массив, С++
first_day
сообщение 11.12.2007 21:31
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


#include <iostream>
using namespace std;
int main ()
{
	int n,m,a[10000],i,minim,j,num=0;
	cin>>n>>m;
	for(i=0;i<n;i++)
		cin>>a[i];
	while (m)
	{	
		for(j=0,minim=a[0];j<n;j++)
			if (minim>a[j]) 
			{
				minim=a[j];
				num=j;
			}
	a[num]++;
	m--;
	}
	cout<<a[num];
}

Поскажите, пожалуйста в чем ошибка.
Мне нужно, чтобы заполнялись n элементов массива. Далее пока некоторое число m не станет равно нулю, нужно при каждом уменьшении m находить минимальное число в массиве и увеличивать его на 1. В конце вывести минимальное число в массиве.
У меня же оно находит минимальное число и все время увеличивает только его... sad.gif


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.12.2007 21:50
Сообщение #2


Гость






num = 0 перед началом цикла for добавь...
 К началу страницы 
+ Ответить 
first_day
сообщение 11.12.2007 23:06
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


Цитата(volvo @ 11.12.2007 21:50) *

num = 0 перед началом цикла for добавь...


Спасибо, помогло.
Теперь только лимит во времени при больших n и m...


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.12.2007 23:09
Сообщение #4


Гость






Насколько большими могут быть M и N? И какой лимит времени? Может быть есть другие способы решения задачи...
 К началу страницы 
+ Ответить 
first_day
сообщение 11.12.2007 23:18
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


Цитата(volvo @ 11.12.2007 23:09) *

Насколько большими могут быть M и N? И какой лимит времени? Может быть есть другие способы решения задачи...

1<=N<=10000, 1<=M<=1000000, элементы массива от 1 до 30000. Лимит 3 секунды.

Да должно быть... Пересматривать все это "немного" не рацианально...
Вот конечная версия программы:
#include <iostream>
using namespace std;
int main ()
{
	int n,m,a[10000],i,minim,j,num=0;
	cin>>n>>m;
	for(i=0;i<n;i++)
		cin>>a[i];
	while (m)
	{	
		for(j=0,minim=a[0],num=0;j<n;j++)
			if (minim>a[j]) 
			{
				minim=a[j];
				num=j;
			}
	a[num]++;
	m--;
	}
	for(j=0,minim=a[0];j<n;j++)
			minim=min(minim,a[j]);
	cout<<minim;
}



--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.12.2007 23:57
Сообщение #6


Гость






С такими значениями ты не уложишься в 3 секунды... Лучше сделай так: сортируешь исходный массив один раз любым способом, я для примера отсортировал "пузырьком" - и потом пробегаешь с начала массива до тех пор, пока текущий его элемент равен ПЕРВОМУ, увеличивая текущий и уменьшая m... Поскольку нет необходимости бегать по всему массиву, а пробежка будет только по его части - такой алгоритм может выиграть по скорости...

Тестировалось с закомментированными значениями, результаты совпадают с теми, которые выдает твоя программа...

#include <iostream>
using namespace std;
int main ()
{
	int n,m,a[10000],i,minim,j,num=0;
	cin >> n >> m;
	
	// n = 7; m = 23;
	// int a[] = {1, 5, 3, 7, 2, 6, 4};

	
	for(i = 0;i < n; i++) {
	    cin >> a[i];
	}  

    // sort array once
    for(i = 0; i < n; i++)
        for(j = n - 1; j > i; j--) {
            if(a[j - 1] > a[j]) {
                int T = a[j - 1]; a[j - 1] = a[j]; a[j] = T;
            }
        }
        
    /*
    for(i = 0; i < n; i++) {
        cout << a[i] << " ";
    }
    */

    while(m) {
        int T = a[0];
        for(i = 0; i < n && T == a[i]; ++i) {
            a[i] += 1; m -= 1;
            if(!m) break;
        }
    }
    cout << endl << a[i];
    return 0;
}


 К началу страницы 
+ Ответить 
first_day
сообщение 12.12.2007 0:55
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


А что означает (!m)?

Спасибо большое, завтра(или точнее сегодня smile.gif) как домой приду, попробую. smile.gif


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.12.2007 1:01
Сообщение #8


Гость






Цитата
А что означает (!m)?
Означает (m == 0)
 К началу страницы 
+ Ответить 
first_day
сообщение 12.12.2007 14:34
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


Все получилось
Единственное я сделал сортировку "метод последовательного поиска минимумом" (при большом кол-ве элементов массива этот метод работает же быстрее "пузырька"?) и в конце нужно было еще раз найти минимальный элемент массива и уже его выводить.
Еще раз спасибо. smile.gif


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
oksana8119
сообщение 18.12.2007 22:40
Сообщение #10





Группа: Пользователи
Сообщений: 1
Пол: Женский
Реальное имя: oksana

Репутация: -  0  +


Можеш мне помочь с масивами. Туго йдут.
вот мая задача. Я решила но неверно

додоатні елементи масиву занести один за одним в інший масив.

Помоги rolleyes.gif пожалуста
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 18.07.2025 8:53
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"