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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 24.12.2013, 01:11   #1
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию (алгоритм)найти i минимальный элемент массива (i с клавиатуры) возможно (с++/c#)(транспортная задача)

задача состоит вот в чём :
найти i минимальный элемент массива (i с клавиатуры)
как это сделать?
для транспортной задачи (нахождение по минимальному элементу в матрице)

Последний раз редактировалось proef; 24.12.2013 в 19:53.
proef вне форума
Старый 24.12.2013, 01:38   #2
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

может не совсем понятно объяснил )
например дан массив J[5] = {-4,-8,2,4,6}
вводим с клавиатуры i =2 ;
то оно должно выводить -4 так -как это второй по возрастанию минимальный элемент
proef вне форума
Старый 24.12.2013, 06:53   #3
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Как вариант отсортировать массив по возрастанию и выводить потом i-ый элемент.
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума
Старый 24.12.2013, 06:57   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Как вариант отсортировать массив по возрастанию и выводить потом i-ый элемент.
От NLogN до N^2..
Есть вариант за N(в общем случае).. и называется он Поиск K-ой статистики..
Poma][a вне форума
Старый 24.12.2013, 18:09   #5
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

мне нужно для решения транспортной задачи (нахождение по методу минимального элемента в матрице)
если элемент уже использовали то пропускаем

Последний раз редактировалось proef; 24.12.2013 в 18:13.
proef вне форума
Старый 24.12.2013, 18:54   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
мне нужно для решения транспортной задачи (нахождение по методу минимального элемента в матрице)
если элемент уже использовали то пропускаем
Понятнее не стало..
Poma][a вне форума
Старый 24.12.2013, 19:50   #7
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию


ну алгоритм такой
рассматриваем всю матрицу тарифов
находим минимальный элемент во всей матрице
записываем в него поставку (min(a[i],b[j]))
и отнимаем от a[i] и b[j] поставку ;
и если a[i] или b[j] = 0 (или оба = 0) то вычеркиваем эту (строку/столбец)
и не трогаем элементы которые в (строке/столбце)
и до тех пока все а[i] и b[j] не будут равны 0
proef вне форума
Старый 24.12.2013, 19:51   #8
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

ну вот (не работает)
Код:
// ConsoleApplication8.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <locale>
#include <iostream>
#include <Windows.h>

class Element
{
public:
	int value;
	int delivery;
    bool QuestionAboutAccess;
      
	Element()
	{
	 value = 0;
	 delivery = 0;
	 QuestionAboutAccess = false;
    }
	friend std::ostream & operator << (std::ostream &Stream,Element &L)
	{
	std::cout<<std::endl<<L.value<<" ( "<<L.delivery<<" ) "<<std::endl;
	return Stream;
	}
	Element &operator = (Element &L)
	{
	 value = L.value;
	 delivery = L.delivery;
	}
	static int MinElement(Element** El,int n,int m,int min)
	{int i,j;
	;
	i = j = 0;
		for (i = 0;i<n;i++)
		{
			for (j = 0;j<m;j++)
			{
				if(min<El[i][j].value)
				{
				
					min =El[i][j].value;
				
				}

			}
		}
	
return min;	}
	 void SetMinDelivery(int Ai,int Bj)
    {
		if(!this->QuestionAboutAccess){
		if(Ai<Bj){ this->delivery = Ai; }
		else  
		if(Bj<Ai) { this->delivery = Bj;  }
		else    { this->delivery = Bj;  }
		 Ai-=this->delivery;
		 Bj-=this->delivery;
	this->QuestionAboutAccess = true;
		}else {return;}}
	 static volatile bool AllElementsisNull(int *a ,int CountA,int *b,int CountB)
	 {
		 int AllElements = 0;
		 for (int i = 0;i<CountA;i++)
		 {
			 if (a[i] == 0){AllElements++;}
			 
		 
		 }
		 for (int j = 0;j<CountB;j++)
		 {
			 if(b[j] == 0) {AllElements++;}
         }
		 if(AllElements == (CountA+CountB)) { return true; }
		 else {return false;
		 }
	 }
	 Element &operator ,(bool value)
	 {
	 this->QuestionAboutAccess = value;
	 return *this;
	 }
	 
};
int main(int argc, _TCHAR* argv[])
{
	SetConsoleTextAttribute(GetStdHandle((DWORD)-11),(15<<4)|(9));
	system("cls");
	int n,m;
	std::cin>>n;
	std::cin>>m;
	int *a = new int[n];
	int *b = new int[m];
	int Min = 0;
	Element **A = new Element*[n];
	for (int i = 0;i<n;i++)
	{
	A[i] = new  Element[m];
	}
	SetConsoleTextAttribute(GetStdHandle((DWORD)-11),(15<<4)|(9));
	for (int i = 0;i<n;i++)
	{
		std::cout<<"a["<<i<<"] = ";
	std::cin>>a[i];
	
	
	}
	SetConsoleTextAttribute(GetStdHandle((DWORD)-11),(15<<4)|(12));
	for(int  j = 0;j<m;j++)
	{
		std::cout<<"b["<<j<<"] = ";
		std::cin>>b[j];
	}
	for (int i = 0;i<n;i++)
	{
		for (int j = 0;j<m;j++)
		{
			std::cout<<"X["<<i<<","<<j<<"] = ";
		std::cin>>A[i][j].value;
		
		
		}
	}
	SetConsoleTextAttribute(GetStdHandle((DWORD)-11),(0<<4)|(7));
	while(true)
	{// не уверен в правильности
		if(Element::AllElementsisNull(a,n,b,m)){break;}
		for (int i = 0;i<n;i++)
		{
			for (int j = 0;j<m;j++)
			{
				if( !A[i][j].QuestionAboutAccess
					|| 
					(a[i] !=0)
					||
					(b[i] !=0))
					
				{
					if(a[i] ==0 ||b[j]==0){
			int Result =   Element::MinElement(A,n,m,Min);
				A[i][j].SetMinDelivery(a[i],b[j]);
				A[i][j],true;
					}
				}else {continue;}



			
			}
		
		
		}
		
	
	
	}
	for (int i = 0;i<n;i++)
	{
		for (int j = 0;j<m;j++)
		{
		std::cout<<A[i][j];
		}}
	

	for (int i =0;i<n;i++){
	delete[] A[i];
	}
	delete[] A;
	delete[] a;
	delete[]b;
	return 0;
}
proef вне форума
Старый 30.12.2013, 23:27   #9
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

сделал по другому методу (по методу северо-западного угла)
уже на c#
не судите строго
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication11
{
    class Program
    {
        struct Element {

           public int Delivery{get;set;}
           public int Value   {get; set;}
           public static int  FindMinElement(int a, int b)
            {
                if (a > b) return b;
                if (a == b) { return a; }
                else return a;
            }
           
        }
       
        static void Main(string[] args)
        {
            int i=0;
            int j=0;
            int n;
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("Введите количество A");
           n =  Convert.ToInt32(Console.ReadLine());
            int[] a = new int[n];
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Введите количество B");
            int m = Convert.ToInt32(Console.ReadLine());
            int[] b = new int[m];
            Element[,] C = new Element[n, m];
            Console.ForegroundColor = ConsoleColor.DarkBlue;
            Console.WriteLine("Введите a[i]");
            for (i = 0; i < a.Length; i++) {
                a[i] = Convert.ToInt32(Console.ReadLine());
            }
            Console.WriteLine("Введите b[i]");
            for (j = 0; j < b.Length; j++) 
            {
                b[j] = Convert.ToInt32(Console.ReadLine());
            }
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("Введите C[i][j]");
            for (i = 0; i < n; i++) { 
            for (j = 0; j < m; j++) 
            {
                Console.Write("a[{0},{1}] = ",i,j);
                Console.ForegroundColor = ConsoleColor.Red;
                C[i, j].Value = Convert.ToInt32(Console.ReadLine());
                Console.ResetColor();
            
            } }
            i = j = 0;
            
            while (i < n && j < m) 
            {
                
                try
                {
                    if (a[i] == 0) { i++; }
                    if (b[j] == 0) { j++; }
                    if (a[i] == 0 && b[j] == 0) { i++; j++; }
                    C[i, j].Delivery = Element.FindMinElement(a[i], b[j]);
                    a[i] -= C[i, j].Delivery;
                    b[j] -= C[i, j].Delivery;
                   }
                catch { }
          }
            for (i = 0; i < n; i++) 
            {
                for (j = 0; j < m; j++) 
                {
                    if (C[i, j].Delivery != 0) { Console.ForegroundColor = ConsoleColor.Blue; 
                        Console.Write("{0}",C[i, j].Value);
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.Write("({0})", C[i, j].Delivery); Console.ResetColor();
                    }
                    else
                    Console.Write("{0}({1})",C[i,j].Value,C[i,j].Delivery);
                }
                Console.WriteLine();
            
            }
            int ResultFunction = 0;

            for (i = 0; i < n; i++) {
                for (j = 0; j < m; j++) 
                {

                    ResultFunction += (C[i, j].Value * C[i, j].Delivery);
                    
                
                }

            
            }
            Console.WriteLine(" Result = {0}", ResultFunction);

            
         
           

            Console.ReadLine();
          

            
            
        }
    }
}
как теперь её оптимизировать по методу потенциалов?
не могу придумать как считать потенциалы

Последний раз редактировалось proef; 30.12.2013 в 23:30.
proef вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести массив с клавиатуры. В полученном массиве найти минимальный элемент. Вывести его на экран ok57 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 17.05.2013 05:07
Ввести с клавиатуры целочисленную матрицу размера 4х4. Найти минимальный элемент каждого столбца. ДМИТРИЙ1234 Помощь студентам 4 14.05.2013 20:57
Нужно найти максимальный и минимальный элемент массива и поменять их местами xxxRiderxxx Помощь студентам 2 25.07.2012 22:30
Исправте ошибку.Надо найти минимальный элемент массива!!! viknik Помощь студентам 1 13.03.2011 18:57