• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

ODPOWIEDZI - Matura Informatyka 2017 poziom rozszerzony zadanie 6

Object Storage Arubacloud
+5 głosów
5,664 wizyt
pytanie zadane 11 maja 2017 w C i C++ przez Evelek Nałogowiec (28,960 p.)
edycja 11 maja 2017 przez Evelek

Rozwiązałem sobie zadanie 6 z dzisiejszej matury z informatyki. Nie zakładam, że rozwiązania są poprawne, więc proszę się nimi nie sugerować. Wyniki się zgadzają z plikiem przyklad.txt. Link do arkusza: http://p.iplsc.com/-/0006KMT9RH3XK1EY.pdf . Link do plików tekstowych (automatycznie pojawi się informacja o pobieraniu) http://plikicke.cie.men.gov.pl/_EGZAMIN_MATURALNY/2017/FORMULA_OD_2015/informatyka/Dane_PR2.zip

W razie błędów proszę pisać, będę poprawiał. Ostatni podpunkt rozdzieliłem na 2 wątki, ze względu na jego słabą wydajność i długi czas wykonania.

Odpowiedzi które mi wyszły:

zad 6.1 - 221 oraz 7

zad 6.2 - 149

zad 6.3 - 753

zad 6.4 - 5

#include <iostream>
#include <future>
#include <thread>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <utility>
using namespace std;

size_t first_func(vector<vector<int>> &mapa, size_t start, size_t end);

int main() {
	fstream file;
	file.open("dane.txt", ios_base::in);

	vector<vector<int>> mapa;
	for (size_t i = 0; i < 200; i++) {
		vector<int> row;
		mapa.push_back(row);
	}
	int temp;
	for (size_t row = 0; row < 200; ++row) {
		for (size_t col = 0; col < 320; ++col) {
			file >> temp;
			mapa[row].push_back(temp);
		}
	}
	file.close();

	//---------------------------------------------------------------------

	int max = mapa[0][0];
	int min = mapa[0][0];
	for (auto &vec : mapa) {
		for (auto &element : vec) {
			if (element < min)
				min = element;
			if (element > max)
				max = element;
		}
	}
	cout << "max: " << max << endl;
	cout << "min: " << min << endl;

	//---------------------------------------------------------------------

	int counts = 0;
	for (size_t row = 0; row < 200; ++row) {
		for (size_t col = 0; col < 160; ++col) {
			if (mapa[row][col] != mapa[row][319 - col]) {
				counts++;
				break;
			}
		}
	}
	cout << "Najmniejsza liczba wierszy: " << counts << endl;

	//----------------------------------------------------------------------

	vector<pair<int, int>> cords;

	int counts_kontr = 0;
	for (size_t row = 0; row < 200; ++row) {
		for (size_t col = 0; col < 319; ++col) {
				if(abs(mapa[row][col] - mapa[row][col + 1]) > 128) {
					cords.push_back(make_pair(row, col));
					cords.push_back(make_pair(row, col + 1));
			}
		}
	}
	for (size_t row = 0; row < 199; ++row) {
		for (size_t col = 0; col < 320; ++col) {
			if (abs(mapa[row][col] - mapa[row + 1][col]) > 128) {
				cords.push_back(make_pair(row, col));
				cords.push_back(make_pair(row + 1, col));
			}
		}
	}
	for (size_t row = 199; row > 0; --row) {
		for (size_t col = 319; col > 1; --col) {
			if (abs(mapa[row][col] - mapa[row][col - 1]) > 128) {
				cords.push_back(make_pair(row, col));
				cords.push_back(make_pair(row, col - 1));

			}
		}
	}
	for (size_t row = 199; row > 1; --row) {
		for (size_t col = 319; col > 0; --col) {
			if (abs(mapa[row][col] - mapa[row - 1][col]) > 128) {
				cords.push_back(make_pair(row, col));
				cords.push_back(make_pair(row - 1, col));
			}
		}
	}

	sort(cords.begin(), cords.end());
	auto unique_iterator = unique(cords.begin(), cords.end());
	cords.erase(unique_iterator, cords.end());
	cout << "kontrastujacych: " << cords.size() << endl;

	//-----------------------------------------------------------------------

	future<size_t> f1 = async(launch::async, first_func, mapa, 0, 160);
	future<size_t> f2 = async(launch::async, first_func, mapa, 160, 320);
	size_t first_result = f1.get();
	size_t second_result = f2.get();
	if (first_result < second_result)
		cout << "Najdluzsza linia pionowa: " << second_result << endl;
	else
		cout << "Najdluzsza linia pionowa: " << first_result << endl;


	cin.get();
}

size_t first_func(vector<vector<int>> &mapa, size_t start, size_t end) {
	vector<int> vec_col;
	size_t max_val = 0;
	size_t temp_val;
	for (size_t col = start; col < end; ++col) {
		for (size_t row = 0; row < 199; ++row) {
			if (mapa[row][col] == mapa[row + 1][col]) {
				vec_col.push_back(row);
				vec_col.push_back(row + 1);
			}
			else {
				sort(vec_col.begin(), vec_col.end());
				auto unique_iter = unique(vec_col.begin(), vec_col.end());
				vec_col.erase(unique_iter, vec_col.end());
				temp_val = vec_col.size();
				if (temp_val > max_val)
					max_val = temp_val;
				vec_col.clear();
			}
		}
	}
	return max_val;
}

 

komentarz 17 maja 2017 przez Krystek102 Bywalec (2,440 p.)
mam pytanko,dlaczego w 50 linijce jest to 160 a nie do 320?
1
komentarz 17 maja 2017 przez Evelek Nałogowiec (28,960 p.)

Przedstawię to na rysunku:

Należy sprawdzić, czy jest symetria w każdym rzędzie, czyli czy element nr 0 jest równy elementowi nr 5, czy element nr 1 jest równy elementowi nr 4, czy element numer 2 jest równy elementowi nr 3. Myślę, że teraz zrozumiesz dlaczego 160 zamiast 320.

Sprawdzanie tego następuje tutaj:

if (mapa[row][col] != mapa[row][319 - col])

 

komentarz 17 maja 2017 przez Krystek102 Bywalec (2,440 p.)
wszystko jasne,dzięki
komentarz 11 lipca 2017 przez Melchior Obywatel (1,300 p.)

Dzięki za kod, miałem problem właśnie z zadaniem 6.3, a co do niego - to masz 2x więcej kodu niż jest konieczne, iterujesz tablice od tyłu 2 razy co daje ci ten sam efekt. cool

1 odpowiedź

+1 głos
odpowiedź 11 maja 2017 przez MetGang Nałogowiec (34,360 p.)

Z całym szacunkiem, ale jak dla mnie za dużo kombinowałeś cheeky. Zadanie było łatwe i można było je naprawdę króciutko rozwiązać.

komentarz 11 maja 2017 przez Evelek Nałogowiec (28,960 p.)

Nie twierdzę, że nie, ale przy ograniczonym czasie na maturze nie zawsze wpadnie pomysł, a na pewno nie będzie już czasu na refaktoryzację kodu. wink

komentarz 11 maja 2017 przez MetGang Nałogowiec (34,360 p.)

Ale i tak szacunek, że pod presją czasu wpadłeś na asynchroniczny program obliczeniowy cheeky.

komentarz 11 maja 2017 przez Evelek Nałogowiec (28,960 p.)

Ja nie jestem maturzysta. cheeky I wczoraj przy nieograniczonym czasie sobie to napisałem. wink Na maturze nigdy bym nie kombinował z wielowątkowością, chyba że naprawdę algorytm by był jakiś niedopracowany i miałbym jeszcze czas na to.

komentarz 11 maja 2017 przez MetGang Nałogowiec (34,360 p.)
A no w sumie tak wynika z treści tematu. Jestem ciekaw czy egzaminatorzy nie mieliby nic przeciwko tak dużej "swobodności" z użyciem std.
2
komentarz 11 maja 2017 przez draghan VIP (106,230 p.)

Jestem ciekaw czy egzaminatorzy nie mieliby nic przeciwko tak dużej "swobodności" z użyciem std.

Program ma być poprawny, tylko tyle. A biblioteka standardowa właśnie po to jest, żeby jej używać.

komentarz 11 maja 2017 przez MetGang Nałogowiec (34,360 p.)

A biblioteka standardowa właśnie po to jest, żeby jej używać.

Sam jestem zwolennikiem tego stwierdzenia smiley

komentarz 11 maja 2017 przez WlPx01 Obywatel (1,220 p.)
Niestety tak nie jest :(
Przykładowo w zadaniach z sortowaniem, użycie sort() z biblioteki algorithm(bądź podobnie pisane :)) da nam dokładnie zero punktów.

Matura z informatyki w części dotyczącej programowania nie sprawdza znajomości STL, a umiejętność logicznego myślenia i zapisu/znajomości algorytmów.

Sam pisałem wczoraj maturę z informatyki i akurat część z programowania była według mnie najłatwiejsza. Za to dwa ostatnie zadania z arkusza kalkulacyjnego (zadanie 4) pozostają niewiadomą do dnia dzisiejszego.

Każdy z podpunktów zadania 6 to były dla mnie w zasadzie trzy linijki.  A jedyna biblioteka, którą zaimplementowałem to fstream.
komentarz 11 maja 2017 przez MetGang Nałogowiec (34,360 p.)

Ja jestem szczęśliwy, że odkryłem konsolę SQL w Accessie, bo inaczej nie byłoby tak kolorowo wink.

1
komentarz 12 maja 2017 przez draghan VIP (106,230 p.)

Niestety tak nie jest :(
Przykładowo w zadaniach z sortowaniem, użycie sort() z biblioteki algorithm(bądź podobnie pisane :)) da nam dokładnie zero punktów.

Na mojej maturze z części praktycznej otrzymałem maksymalną liczbę punktów, nie wahałem się używać std. A w C++ pisałem nie tylko zadania "napisz program...", ale również zadanie typowo bazodanowe.

Przykładowy "klucz" oceniania: punkty przyznawane są za prawidłowe odpowiedzi na postawione pytania, nie za rozpisanie algorytmów.

Podobne pytania

0 głosów
1 odpowiedź 594 wizyt
pytanie zadane 29 kwietnia 2018 w C i C++ przez Seyn Początkujący (300 p.)
0 głosów
1 odpowiedź 2,034 wizyt
pytanie zadane 19 sierpnia 2018 w Python przez MazdyxX Nowicjusz (190 p.)
0 głosów
3 odpowiedzi 1,181 wizyt
pytanie zadane 25 lipca 2017 w C i C++ przez niezalogowany

92,568 zapytań

141,422 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...