• 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

VPS Starter Arubacloud
+5 głosów
5,821 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ź 642 wizyt
pytanie zadane 29 kwietnia 2018 w C i C++ przez Seyn Początkujący (300 p.)
0 głosów
1 odpowiedź 2,118 wizyt
pytanie zadane 19 sierpnia 2018 w Python przez MazdyxX Nowicjusz (190 p.)
0 głosów
3 odpowiedzi 1,254 wizyt
pytanie zadane 25 lipca 2017 w C i C++ przez niezalogowany

92,775 zapytań

141,703 odpowiedzi

320,567 komentarzy

62,109 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

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!

...