Задача 4. Передача информации Исследовательская группа «Распределенные центры исследований» вела серьезный проект, связанный с обработкой большого количества информации. Любая ошибка может испортить результаты исследования, поэтому организаторы решили повторять передачу бита K раз. Ваша задача – вывести верную строку из «верных» битов. «Верным» считается бит, который встретился в блоке из K бит чаще других. Входные данные 1 ≤ K ≤ 1000 – длина блока передачи, всегда нечетный. S – битовая строка, длиной не более 10 000 символов. Выходные данные Итоговая строка Пример 3 111000111 101 5 100001110011111 011 Вот мое решение, но говорится что оно не правильное, может кто скажет в чем? Код (Text): #include <iostream> #include <string> using namespace std; const int size_of_cc = 16; int main(int argc,char **argv) { string str; int k; cin >> k; cin >> str; if (k == 1) { cout << str;return 0; } int len = str.length(); int i; int bit0 =0; int bit1 = 0; string res=""; for (i = 0; i < len;i++) { if (str[i] == '0') bit0++; else bit1++; if ((i+1) % k == 0) { if (bit0>bit1) res +='0'; else res += '1'; bit0=0; bit1= 0; } } cout << res; return 0; }
Вообще-то битовая строка и строка символов "0", "1" не совсем одно и тоже И для таких вопросов есть соответсвующий раздел Да и O2.rar имхо следует заменить на более эффективный O2.7z )
Y_Mur >Вообще-то битовая строка и строка символов "0", "1" не совсем одно и тоже Условие не я придумывал А вопросы http://www.wasm.ru/forum/viewtopic.php?id=17088 там рассматриваются лабораторные
дык и я про то что в условии речь про битовые строки, а ты почему-то рассматриваешь их как символьные и здесь тот же хлам по уровню медитации
Y_Mur Вы меня совсем в тупик поставили , а как что их рассматривать? ~~~ Битовые строки — это строки которые состоят из единиц и нулей.
REASY Я думаю, что Y_Mur имеет ввиду то, что 3 111000111 это не строка из 9 символов, а 2 байта в первом из которых содержится 11100011, а во в-ом 1xxxxxxx
символ "1" в кодировке ANSI состоит из 8 бит 00110001 если речь о передаче инфы то никто биты символами "0"/"1" заменять есно не будет )) Стандартная работа с битами - операциями побитового сдвига и логическими операциями or, and, xor с соответствующими битовыми масками.
Вообщем, эта задача "1. Пластиковые карты" оказалась правильной,но "4. Передача информации" пишет Wrong answer on test 5
Atlantic А кто говорит что они сложные? ЗЫ: тема была создана не для оценки сложности задач.........................
Еще вопрос к этой задаче 3. Прикрепил ее. Условие задачи я не очень понял, но все таки есть решение и специально для проверки написал генератор. Решение: Код (Text): #include <iostream> #include <string> #include <cmath> using namespace std; const int magic_offset = 0x40; int bin2dec(char *array); int main(int argc,char **argv) { int width,height,len; cin >> width; cin >> height; cin >> len; if (len == 0) return 0; int size_buf = len*2*5; char bf[8] = "\00"; cin.get(); char *buf = new char[size_buf]; cin.getline(buf,size_buf); int len_buf = strlen(buf); char *mask_str = new char[len+1]; int i,k = 0, m = 0; int temp; for (i = 0; i < len_buf;i+=2) { bf[k] = buf[i]; k++; if (k == 5) { temp = bin2dec(bf); if (temp == -1) mask_str[m] = 0x20; else mask_str[m] = char(temp+magic_offset); m++; k = 0; memset(bf,0x00,7); } } mask_str[m] = 0x00; cout << mask_str; return 0; } int bin2dec(char *array) { int res = 0; if (!strcmp(array,"00001")) { res = -1; return res; } int i,k = 0; int len = strlen(array); for (i = len-1;i >=0; i--) { if (array[i] == '0') { k++; continue; } res += pow(2,(double)k) * (array[i] - 0x30); k++; } return res-1; } Генератор принимает строку символов, алфавит "_ABCDEFGHIJKLMNOPQRSTUVWXYZ"(_ - это пробел[0x20]), на выходе кодированные символы в bin используя 5 бит. Код (Text): #include <iostream> #include <string> #include <cmath> using namespace std; string templ[] = { "0 0 0 0 1","0 0 0 1 0","0 0 0 1 1","0 0 1 0 0", "0 0 1 0 1","0 0 1 1 0","0 0 1 1 1","0 1 0 0 0", "0 1 0 0 1","0 1 0 1 0","0 1 0 1 1","0 1 1 0 0", "0 1 1 0 1","0 1 1 1 0","0 1 1 1 1","1 0 0 0 0", "1 0 0 0 1","1 0 0 1 0","1 0 0 1 1","1 0 1 0 0", "1 0 1 0 1","1 0 1 1 0","1 0 1 1 1","1 1 0 0 0", "1 1 0 0 1","1 1 0 1 0","1 1 0 1 1","1 1 1 0 0", "1 1 1 0 1","1 1 1 1 0","1 1 1 1 1" }; const int magic_offset = 0x40; int bin2dec(char *array); int main(int argc,char **argv) { string res; char buf[4] = "\00"; int hex[512]; char str[512]; cin.getline(str,512); int len = strlen(str); int i; int k; for (i = 0; i < len; i++) { if (str[i] == 0x20) {hex[i] = 1;continue;} itoa((int)(str[i]-0x3F),buf,10); hex[i] = atoi(buf); } for (i = 0; i < len; i++) { res += templ[hex[i]-1]; if (i != len - 1) res += ' '; } cout << strlen(str) << endl << res; return 0; } Входные параметры для примера: 10 10 18 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Мда.... Оказалось я не так понял условие задачи 3. Оказывается коды символов в десятичной системе. Решение прикрепил, хотя кому интересно? )
Y_Mur Так вы можете продолжить вашу мысль, а то я ничего нового не могу придумать... И каким способом она поможет решить данную задачу?(Как применить то, о чем вы написали выше)
REASY Первоначальный ход мысли у тебя хоть и дилетантски реализован, но в целом верен, только нужно перейти от символов к битам маски: Bit7 = 0x80 Bit6 = 0x40 Bit5 = 0x20 Bit4 = 0x10 Bit3 = 0x08 Bit2 = 0x04 Bit1 = 0x02 Bit0 = 0x01 логическое and символа с соответсвующей маской и проверка результата на 0 дадут состояние соответсвующего бита в символе можно последовательно прогнать все маски, а можно проверять только старший или младший бит сдвигая байт(символ) влево/вправо. погугли - инфы и учебников по теме море. угу задачка далеко не дзенная
Y_Mur Про работу с битам я вроде чуть мыслю, вот даже кусок кода(сам писал), который выводит битовое представления числа от 0-255 Код (Text): void printByte(unsigned char value) { int i; unsigned char j=0x80; for(i=7; i >= 0; i--) { cout << bool(j & value); j=j >> 1; } } Прощу вас показать на пальцах что мне сделать со строкой из первого примера: Длина блока передачи - 3. Затем сама битовая строка 111000111.
Вот еще одна задача, она мне показалось более сложной. У меня нет даже предположений как начать ее решать(может только пошаманить с координатами,хотя,я думаю, само решение и будет работа с координатами). Задача также прикреплена.
REASY Мне решение представляется так. Проходимся по массиву вот этим: Код (Text): FindSemiplane proc; PUSH ESI; PUSH EDI; MOV EDI, DWORD PTR [ECX]; SUB EDI, DWORD PTR [EAX]; MOV ESI, DWORD PTR [EDX+4]; SUB ESI, DWORD PTR [EAX+4]; IMUL ESI, EDI; MOV EDI, DWORD PTR [EDX]; SUB EDI, DWORD PTR [EAX]; MOV EAX, DWORD PTR [EAX+4]; SUB EAX, DWORD PTR [ECX+4]; IMUL EAX, EDI; ADD EAX, ESI; JE @exit; SETG AL; MOVZX EAX, AL; ADD EAX, 1; @exit: POP EDI; POP ESI; RET; FindSemiplane endp; Если все остальные точки, кроме уже входящих в "контур передатчиков", лежат по одну сторону от проверяемого вектора, добавляем его в контур, и начинаем проверку для вектора "конечная точка контура -> следующая в списке". Если точки (кроме уже добавленных - их можно не проверять) есть с обеих сторон, берём следующую и делаем её концом вектора. Если получилось, она становится началом. Продолжаем до тех пор, пока не достигнем конца массива. Если уже дошли до конца, а целостного контура ещё нет - соединяем первую и последнюю найденные точки, и ищем лежащие вне получившейся фигуры. Таких нет? Контур завершён. Есть? Тогда проходимся этим же алгоритмом только по этим точкам (началом должен выступать или конец последнего вектора, или начало первого). PS. Данной функции нужно в EAX, EDX и ЕСХ скормить указатели на структуры, содержащие по 2 DWORD каждая - первые два это соответственно начало и конец вектора, третий - это точка, для которой определяем её позицию. На выход подаётся либо 1, либо 2, либо 0. Первое означает, что точка лежит в левой полуплоскости при данном векторе как разделителе, второе - что в правой, третье - на границе раздела. PPS. Проверку можно считать не пройденной, когда найден хотя бы один объект, лежащий по другую сторону, нежели ранее найденные. Останавливаем и переходим к следующей точке. [+]: Кстати да. "Нужная" сторона, по которую должны лежать все точки, определяется при первом найденном векторе, и далее не меняется! Извините что сумбурно и непонятно. Щас разберу на примере. Вот только реализацию допишу...