Breed Counting – Omówienie zadania – Amerykańska Olimpiada Informatyczna USACO

Szczegółowe omówienie zadania Breed Counting:

Link do powyższego omówienie zadania Breed Counting: https://youtu.be/_gLUezRAW0s?t=823
Omówienie kodu zadania Breed Counting: https://youtu.be/_gLUezRAW0s?t=3899
Link do treści zadania Breed Counting: http://www.usaco.org/index.php?page=viewproblem2&cpid=572

Zadanie Breed Counting jest ćwiczeniowym zadaniem na sumy prefiksowe – możliwość policzenia sumy liczb na dowolnym przedziale przy pomocy jednej operacji odejmowania (czas stały).

Zadanie Breed Counting  pochodzi z dywizji Silver Amerykańskiej Olimpiady Informatycznej USACO – odpowiednika naszej Olimpiady Informatycznej Juniorów: https://youtu.be/KI7un-HU_Hk?t=49
Daje piękny wpis do CV: https://youtu.be/P2sLFZBjOmM?t=7223
Dlaczego warto brać udział w Amerykańskiej Olimpiady Informatycznej USACO? https://youtu.be/K7fZfJ8nN6A?t=6848
Co to jest USACO? https://youtu.be/nvA92I5nU0c?t=1414


Jak się uczyć na podstawie tego zadania? https://youtu.be/QgLyXYmFQeU?t=2019
Pamiętaj by zajrzeć max 1 raz – wtedy się rozwijasz: https://youtu.be/pkLXuuOe_qA?t=3625

Lista zadań z rozwiązaniami: https://oki.org.pl/lista-zadan-materialy.php
Samouczek – przygotowanie do Olimpiad: https://oki.org.pl/tutorial/

Bezpłatne zajęcia OKI: https://oki.org.pl/harmonogram-zajec/

Informacje o zajęciach: https://oki.org.pl/newsletter.php

Warto startować w Olimpiadzie Informatycznej!
https://youtu.be/K7fZfJ8nN6A?t=109


Kod C++ programu Breed Counting, który jest omówiony w powyższym filmie i który otrzymuje 100%


#include <bits/stdc++.h>
using namespace std;

const int MAXN = 100*1000 + 7;

int krowy1[MAXN];
int krowy2[MAXN];
int krowy3[MAXN];

int pref1[MAXN]; // sumy prefiksowe dla krow o id = 1
int pref2[MAXN]; // sumy prefiksowe dla krow o id = 2
int pref3[MAXN]; // sumy prefiksowe dla krow o id = 3

int main()
{
	ifstream in("bcount.in");
	ofstream out("bcount.out");

	int n, q;
	in >> n >> q;
	for (int i = 1; i <= n; ++i) {
		int idKrowy;
		in >> idKrowy;

		if (idKrowy == 1)
			krowy1[i] = 1;

		if (idKrowy == 2)
			krowy2[i] = 1;

		if (idKrowy == 3)
			krowy3[i] = 1;
	}

	// obliczamy sumy prefiksowe dla kazdego id
	for (int i = 1; i <= n; ++i) {
		pref1[i] = pref1[i - 1] + krowy1[i];
		pref2[i] = pref2[i - 1] + krowy2[i];
		pref3[i] = pref3[i - 1] + krowy3[i];
	}

	// odpowiadamy na zapytania, kazde w czasie stalym
	for (int i = 1; i <= q; ++i) {
		int l, r;
		in >> l >> r;

		int ileKrowId1 = pref1[r] - pref1[l - 1];
		int ileKrowId2 = pref2[r] - pref2[l - 1];
		int ileKrowId3 = pref3[r] - pref3[l - 1];
		out << ileKrowId1 << ' ' << ileKrowId2 << ' ' << ileKrowId3 << '\n';
	}
	return 0;
}
Kod C++ programu Breed Counting, który jest omówiony w powyższym filmie i który otrzymuje 100%

 


Kod Python programu Breed Counting, który otrzymuje 100%

MAXN = 100*1000 + 7

krowy1 = [0 for i in range(MAXN)]
krowy2 = [0 for i in range(MAXN)]
krowy3 = [0 for i in range(MAXN)]

pref1 = [0 for i in range(MAXN)] # sumy prefiksowe dla krow o id = 1
pref2 = [0 for i in range(MAXN)] # sumy prefiksowe dla krow o id = 2
pref3 = [0 for i in range(MAXN)] # sumy prefiksowe dla krow o id = 3

inFile = open("bcount.in", 'r')
outFile = open("bcount.out", "w")

n, q = inFile.readline().split()
n = int(n)
q = int(q)

for i in range(1, n+1):
	idKrowy = int(inFile.readline())

	if idKrowy == 1:
		krowy1[i] = 1

	if idKrowy == 2:
		krowy2[i] = 1

	if idKrowy == 3:
		krowy3[i] = 1

# obliczamy sumy prefiksowe dla kazdego id
for i in range(1, n+1):
	pref1[i] = pref1[i - 1] + krowy1[i]
	pref2[i] = pref2[i - 1] + krowy2[i]
	pref3[i] = pref3[i - 1] + krowy3[i]

# odpowiadamy na zapytania, kazde w czasie stalym
for i in range(1, q+1):
	l, r = inFile.readline().split()
	l = int(l)
	r = int(r)

	ileKrowId1 = pref1[r] - pref1[l - 1]
	ileKrowId2 = pref2[r] - pref2[l - 1]
	ileKrowId3 = pref3[r] - pref3[l - 1]
	outFile.write(str(ileKrowId1) + ' ' + str(ileKrowId2) + ' ' + str(ileKrowId3) + '\n')


Nie dodano jeszcze komentarza, rozpocznij dyskusję pierwszy.

Dodaj komentarz