Форум программистов, компьютерный форум CyberForum.ru

Многопутевое слияние. Пропускается элемент с индексом 1 - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Правильность алгоритма Диница http://www.cyberforum.ru/cpp-beginners/thread1136733.html
Вот код моего алгоритма Диница.Но вот незадача - на всех моих ручных тестах он работает, а как отправить тестить куда-нибудь - так на многих тестах WA получает. Может кто подскажет, в чём тут может быть беда, а? #include <iostream> #include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> #include <utility> #include <queue>
C++ Найти номер последнего максимального элемента последовательности используя одномерный массив 2 Задача:Дана последовательность из N действительных чисел найти номер последнего максимального элемента используя одномерный массив. http://www.cyberforum.ru/cpp-beginners/thread1136717.html
C++ Написать класс замены строк в матрице
Задана матрица целых чисел. Поменять местами строку, содержащую элемент с наибольшим значением, со строкой, содержащей элемент с наименьшим значением. Считать, что элементы единственны, использовать процедуры. Нужно написать программу используя классы и объекты. Помогите пожалуйста, хотя бы советом с ходом действий.
C++ Подсчитать количество букв, слов и цифр в строке
Во введенной строке символов подсчитать количество букв (отдельно русского и английского алфавитов), цифр, слов, предложений. (Считать, что слова разделены пробелами, а предложения — точками).
C++ Подсчитать количество нечетных элементов последовательности, используя одномерный массив http://www.cyberforum.ru/cpp-beginners/thread1136710.html
1 Задача:Дана последовательность целых чисел.Подсчитать кол-во нечетных элементов используя одномерный массив.
C++ Выполнить задание, оформив его в виде шаблона функции #include "stdafx.h" #include <iostream> using namespace std; const int MAXARRSIZE = 10000; // прототип фуннкции для подсчета отрицательных чисел в массиве void sum_negtv_numbrs(int *, int); подробнее

Показать сообщение отдельно
aksdaqg
0 / 0 / 0
Регистрация: 31.03.2014
Сообщений: 115

Многопутевое слияние. Пропускается элемент с индексом 1 - C++

02.04.2014, 11:29. Просмотров 446. Ответов 2
Метки (Все метки)

Собсна вот алгоритм. Проблема в том, что пропускается элемент с индексом 1. В чем проблема. Еще если можно, помогите организовать чтение из файла.
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
 
using namespace std;
 
#define MAXNUMBER 10
 
int base[MAXNUMBER+1],
   b1[MAXNUMBER+2],
   b2[MAXNUMBER+2],
   b3[MAXNUMBER+2],
   b4[MAXNUMBER+2];
int i=1;
 
int merges( int *dest, int *f1, int c1, int *f2, int c2)
    
//сливает две последовательности в одну
//возвращает число вставленных элементов
{ int i=0;
 int t1=0,t2=0;
 int *tf1,*tf2;
 while(c1>0||c2>0)
 { if(c1>0)t1=1;
   if(c2>0)t2=1;
   tf1=f1;tf2=f2;
   do
   {
   i++;
   if(t1&&t2) { if(*(f1)<*(f2)) *(dest++)=*(f1++);
else *(dest++)=*(f2++);
      }
   else if(t1){ *(dest++)=*(f1++);}
    else if(t2){ *(dest++)=*(f2++);}
   if(tf1!=f1) { tf1=f1;if(*(f1)<*(f1-1)) t1=0;}
   if(tf2!=f2) {tf2=f2;if(*(f2)<*(f2-1)) t2=0; }
   }while(t1||t2);
   c1--;c2--;
 };
 return i;
}
int number_of_serieses()
{ int *master;
 master=base;
 int j=1;
 for(int i=0;i<MAXNUMBER;i++)
  { if(*(master)<*(master-1)) j++;
    master++;
  }
 return j;
}
void split( int * master, int *f1, int *f2, int *f3, int *f4)
//разбивает последовательность по подпоследовательностям
{ int *t1,*t2,*t3,*t4;
 t1=f1;t2=f2;t3=f3;t4=f4;
 f1++;f2++;f3++;f4++;
 int i=1;
 *(f1++)=*(master++);
 int j=1,sn=double(number_of_serieses()+1)/4,n=1;
 sn=sn>0?sn:1;
 *(t1)=0;
 *(t2)=0;
 *(t3)=0;
 *(t4)=0;
 do
 { if(*(master)<*(master-1))
   { switch(j)
     { case 1:*(t1)+=1;n++;break;
case 2:*(t2)+=1;n++;break;
case 3:*(t3)+=1;n++;break;
case 4:*(t4)+=1;n++;break;
     }
     if(n>sn) { j=j<4?j+1:j;n=1; }
   }
   switch(j)
   { case 1: *(f1++)=*(master++);break;
     case 2: *(f2++)=*(master++);break;
     case 3: *(f3++)=*(master++);break;
     case 4: *(f4++)=*(master++);break;
   }
 }
 while (++i<MAXNUMBER);
 *(t1)+= j!=1 ?0:*(t1)+1;
 *(t2)+= j!=2 ?0:*(t2)+1;
 *(t3)+= j!=3 ?0:*(t3)+1;
 *(t4)+= j!=4 ?0:*(t4)+1;
 *(f1)=0;
 *(f2)=0;
 *(f3)=0;
 *(f4)=0;
}
 
void fillmaster()
{ 
    for(int i=0;i<MAXNUMBER;i++)
{   cout << i <<":";
  cin >> base[i];//=random(10000);
}
    
    base[i]=0;
}
void write(int *matrix)
{ for(int i=0;i<MAXNUMBER;i++)
  {
    if (!(i%20)) {cout << "\n----------------------";
  getch();
 };
    cout << "\n[" << i << "]\t"<< *(matrix++);
  }
}
void main()
 
{// clrscr();
fillmaster();
//  write(base);
 getch();
 
 cout<<"\nNumber Series=" << number_of_serieses();
while(number_of_serieses() != 1)
{
 split(base,b1,b2,b3,b4);
 int shift=merges(base,b1+1,*(b1),b2+1,*(b2));
 merges(base+shift,b3+1,*(b3),b4+1,*(b4));
//  cout<<"\nNumber Series=" << number_of_serieses();
//  getch();
}
 write(base);
 getch();
 cout<<"\nThe END - - - - - - - - -\n";
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru