Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2015, 11:26   #1
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию Коррупция.Жадный Алгоритм

Искал тут посты про жадные алгоритмы но именно такую задачу не нашел



С целью борьбы с теневой экономикой банк решил внедрить объединение N счетов фирмы в один. За одну операцию объединяются 2 счета и банк автоматически перечисляет на свой счет Р% от суммы объединения за выполнение операции и закрытие одного из счетов. Какая наибольшая сумма может остаться на счету фирмы? На каждом из счетов до внедрения политики объединения было не более чем G грн.

Входные данные

В первой строке 2 числа: количество счетов N и процент отчислений P.

Во второй строке N чисел: сумма на каждом из счетов фирмы.

Выходные данные

Наибольшая сумма, которая может остаться на счету.

2 ≤ N ≤ 100000

0 ≤ Р ≤ 20

0 ≤ G ≤ 10000


Пример
Вход
4 5
1000 1100 1200 1300

Выход
4151.50

................................... .
как бы по жадности думаю сортировать.и обьединять маленькие счета. по глазу только видно обьединяя самые маленкие счета каждый раз результат оптимальный ибо не знаю как ещё((.результат обьединения кидаю в буфер, чтобы не портит данный список(отсортированный).Кратко говоря обьединяя все равно все новые счета учитываются как сортированные.но результат не верен.


Не то чтобы с имплементил алгоритм удивительно.Прежде всего правильный ли подход я использую(про жадности)?чую нет(

если да. то как можно фрагментики оптимальнее написать?)

Код:
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Collections;

class Main{
	

	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int count = sc.nextInt();
		double P = sc.nextDouble();

		LinkedList<Double> accs = new LinkedList<Double>();
		LinkedList<Double> buf = new LinkedList<Double>();
		for (int i = 0; i < count; i++){

			accs.add(sc.nextDouble());

		}
		double c,b,tmp = 100000;
		Collections.sort(accs);
		System.out.println(accs.toString());
		while (accs.size() != 1 || buf.size() != 0){ 
			if (accs.size() >1 ){  // имеються 2 счета
				b = accs.poll(); // первый берем
				
				if (buf.size() > 0 && (tmp < b + 0.2)){ //как сильно отличается елемент в буфере

					buf.add((buf.pop() + b)*(100-P)/100);

					tmp = buf.getFirst();


				}	else buf.addLast((b + accs.pop())*(100 - P)/100); // или просто берем 2 счета, результат кидаем  буфер

			} else { // если же не хватает елементов

                               // кидаем с буфера на  Аккс.
				accs.addAll(buf);
				buf.clear();

			}
			
		}

		System.out.println(accs.pop());
		
	}



}

Последний раз редактировалось Тамерлан Абилов; 24.06.2015 в 11:57.
Тамерлан Абилов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Жадный алгоритм на графе slimper86 Помощь студентам 4 27.06.2013 09:31
Жадный алгоритм? Loki_veil Помощь студентам 0 27.06.2012 12:05
Жадный алгоритм(Delphi) maddanil Помощь студентам 0 26.05.2012 17:59
Жадный алгоритм merhaba1992 Помощь студентам 1 05.11.2011 00:24
Жадный алгоритм и перебор mailjaffka Помощь студентам 10 17.05.2010 16:20