3 / 3 / 2
Регистрация: 16.11.2010
Сообщений: 165
1

проблема с присвоением

19.11.2011, 07:34. Показов 593. Ответов 1
Метки нет (Все метки)

Возникла такая проблема, нужно к элементу вектора прибавить число, но у меня проблема с перегрузкой оператора, подскажите как лучше это сделать!!!
Условие!
Имеется N камней веса А1,А2,...,АN.
Необходимо разбить их на две кучи таким образом, чтобы веса куч отличались не более чем в 2 раза. Если этого сделать нельзя, то указать это.
Main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <cstdlib>
#include <iostream>
#include "method.cpp"
#include <fstream>
#include <iomanip>
using namespace std;
 
int main(int argc, char *argv[])
{
      
    ifstream input_file("file.txt"); // îòêðûâàåì ôàéë ñ äàííûìè
    vector<selection<int> > stones; // Âåêòîð ýëåìåíòîâ
    selection<int> e; //  ñòðóêòóðà
    while(!input_file.eof()) // ïåðåìåùàåì ôàéëû â âåêòîð
    {
      input_file>>e.x;
      stones.push_back(e);
    }
    create_lot(stones);
    arrange_lot(stones);
    arrange_bags(stones);
    for(int i=0; i<stones.size(); i++) // Âûâîä
      cout<<setw(3)<<stones.at(i).x<<endl;
    input_file.close();
  
    system("PAUSE");
    return EXIT_SUCCESS;
}
struct.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef SELECTION
#define SELECTION
 
template<class T> 
struct selection{
  T x; // Êëþ÷
    bool operator < (selection<T> e) // Ôóíêöèÿ ñðàâíåíèÿ
  {
     if(x < e.x)
        return true;
      else
        return false;
    
  }
int selection::operator+(selection<T> e)
{   return selection(x+e.x);
                    }
  
};
#endif
method.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "struct.h"
#include <vector>
#include <iostream>
using std::vector;
using std::cout;
using std::endl;
 
 
template<class T> 
void create_lot(vector<T> &stones) //ñîçäàíèå ìàññèâà âåñîâ êàìíåé
{
        cout<<stones.size()<<" Number of stones. They weigh:\n";
        for(int k=0;k < stones.size();k++);
}
 
template<class T> 
void arrange_lot(vector<T> &stones) //ñîðòèðîâêà ïî óáûâàíèþ
{
int i,j;
T temp;
 
for(i=0;i < stones.size()-1;i++)
        for(j=i+1; j < stones.size() ;j++)    
                if(stones.at(i) < stones.at(j))
                    {   temp = stones.at(i);
                        stones.at(i) = stones.at(j);
                        stones.at(j) = temp;  }
                        
}
template<class T> 
void arrange_bags(vector<T> &stones) //ñîçäàåò äâå êó÷è áîëåå áëèçêèå ïî ðàçìåðó
{
int k1, k2, i, sum1=0, sum2=0;
 
T bag1[stones.size()-1],bag2[stones.size()-1];
for(i=0;i<stones.size();i++)
{
        if(sum1<=sum2)
        {       bag1[k1]=stones.at(i);
                sum1+=stones.at(i);//вот тут вот ругается
                k1++;}
        else
        {       bag2[k2]=stones.at(i);
                sum2+=stones.at(i);// и вот тут
                k2++;}
}
if(1.0*sum1/sum2 <=2)
{       cout<<"\n heap 1: ";
        for(i=0;i<k1;i++)
                //cout<<bag1[i]<<"  ";
        cout<<"\n weigh 1: "<<sum1<<endl;
        cout<<"\n heap2: ";
        for(i=0;i<k2;i++)
                //cout<<bag2[i]<<"  ";
        cout<<"\n weigh 2: "<<sum2<<endl;
}
else cout<<"more 2\n";
}
function.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef VIBOR
#define VIBOR
 
#include <vector>
 
using std::vector;
 
template<class T> void create_lot(vector<T>&);
template<class T> void arrange_lot(vector<T>&);
void arrange_bags(vector<T> &)
 
#endif
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2011, 07:34
Ответы с готовыми решениями:

Конструктор с присвоением
вот есть в моем классе поле ссылка, но она не инициализирована, ее нужно инициализировать в...

Загвоздка с присвоением
подскажите в чем загвоздка, а именно в условии не присваивает значение и его позицию #include...

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

Проблема с присвоением a := self.
Проблема с присвоением a := self... сразу же после этого смотрю дампы памяти и они отличаются,...

1
4424 / 2363 / 853
Регистрация: 29.11.2010
Сообщений: 5,239
19.11.2011, 18:57 2
Прямой перебор. Первое попавшееся разделение, подходящее под условие.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <vector>
#include <iostream>
#include <algorithm>
#include <numeric>
#include <ctime>
#include <cstdlib>
 
struct RandomInteger  {
  RandomInteger(const int &min, const int &max)
    : min_(min), max_(max) {}
  float operator()() {
    return (rand() % (max_ - min_ + 1) + min_);
  }
 private:
  int min_, max_;
};
 
template <class ValueType>
std::ostream &operator<<(std::ostream &stream, std::vector<ValueType> &vector) {
  typedef std::vector<ValueType> Vector;
  for (typename Vector::iterator i = vector.begin(); i != vector.end(); ++i)
    stream << (*i) << " ";
  return stream;
}
 
// побочный эффект -- сортировка значений
template <class Iterator>
Iterator findMiddleWeight(Iterator begin, Iterator end) {
  std::sort(begin, end);
  Iterator pivot = begin + (end - begin) / 2;
  int sumLeft = std::accumulate(begin, pivot, 0);
  int sumRight = std::accumulate(pivot,  end, 0);
  while (pivot >= begin && pivot != end) {
    if (std::max(sumLeft, sumRight) / std::min(sumLeft, sumRight) < 2)
      return pivot;
    if (sumLeft > sumRight) {
      --pivot;
      sumRight += *pivot;
      sumLeft -=*pivot;
    } else {
      sumRight -= *pivot;
      sumLeft +=*pivot;
      ++pivot;
    }
  }
  return end;
}
 
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
  size_t stonesCount = 23;
  std::vector<int> stones(stonesCount);
  std::generate(stones.begin(), stones.end(), RandomInteger(100, 1000));
  std::cout << stones << std::endl;
 
  std::vector<int>::iterator middle = findMiddleWeight(stones.begin(),
    stones.end());
 
  if (middle == stones.end()) {
    std::cout << "Cannot be done." << std::endl;
  } else {
    std::cout << stones << std::endl << "Left: " << std::endl;
    for (std::vector<int>::iterator i = stones.begin(); i != middle; ++i)
      std::cout << *i << " ";
    std::cout << "| ";
    for (std::vector<int>::iterator i = middle; i != stones.end(); ++i)
      std::cout << *i << " ";    
    std::cout << "Sum left:  " << std::accumulate(stones.begin(), middle, 0) <<
      std::endl << "Sum right: " << std::accumulate(middle, stones.end(), 0) <<
      std::endl;
  }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2011, 18:57
Помогаю со студенческими работами здесь

Проблема с присвоением объектов созданного класса
Задание было таким: решение задачи на оптимизацию симплекс методом. Рекомендовалось считать в...

Проблемы с присвоением IP на windows 7
Здравствуйте. Помогите пожалуйста решить такую проблему. На работе в бухгалтерии стоит 2...

Побитовое или с присвоением
Здравствуйте уважаемые форумчане! Я не сразу написал тему, как столкнулся с проблемой, а искал...

Ошибка с присвоением значения
Здравствуйте! Можете подсказать как решить проблему с присвоением значения в классе Program. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru