Milk Pails – Omówienie zadania z USACO – BFS, Wszystko może być grafem

Szczegółowe omówienie zadania Milk Pails:

Link do powyższego omówienia zadania Milk Pails: https://youtu.be/8m6_bOKvzqI?t=1001
Omówienie kodu który zadania Milk Pails: https://youtu.be/8m6_bOKvzqI?t=5350

Link do treści zadania Milk Pails i możliwości umieszczania rozwiązań:
http://www.usaco.org/index.php?page=viewproblem2&cpid=620

Zadanie Milk Pails pokazuje jak stworzyć graf z… wiader: https://youtu.be/8m6_bOKvzqI?t=1754
Stworzony graf jest grafem stanów: https://youtu.be/8m6_bOKvzqI?t=4969
Nasz graf nie ma formalnej reprezentacji: https://youtu.be/8m6_bOKvzqI?t=5053

Główny algorytm użyty w zadaniu – BFS: https://youtu.be/8m6_bOKvzqI?t=2384
BFS liczy odległości: https://youtu.be/8m6_bOKvzqI?t=2384
Czy można liczyć odległości DFS-em? https://youtu.be/8m6_bOKvzqI?t=3608
Złożoność BFS: https://youtu.be/8m6_bOKvzqI?t=5242
Kod BFS-a: https://youtu.be/8m6_bOKvzqI?t=5454


Zadanie z Amerykańskiej Olimpiady USACO! https://youtu.be/VvJhOAXIQOk?t=156
Pozwala stworzyć fantastyczne CV! https://youtu.be/VvJhOAXIQOk?t=5449


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/

Zajęcia: 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 Milk Pails, który jest omówiony w powyższym filmie i który otrzymuje 100%


#include <bits/stdc++.h>
#define fi first
#define se second

using namespace std;

const int MAXN = 100 + 7;

int odleglosc[MAXN][MAXN];
// pojemność pierwszego, drugiego wiadra
int X, Y;

void BFS(pair<int, int> start)
{
	for (int i = 0; i <= X; ++i) {
		for (int j = 0; j <= Y; ++j)
			odleglosc[i][j] = -1;
	}

	queue<pair<int, int>> Q;
	Q.push(start);
	
	odleglosc[start.fi][start.se] = 0;
	while (!Q.empty()) {
		pair<int, int> v = Q.front();
		Q.pop();

		// ile przelejemy z drugiego do pierwszego
		int d21 = min(v.se, X - v.fi);
		// ile przelejemy z pierwszego do drugiego
		int d12 = min(v.fi, Y - v.se);
		pair<int, int> sasiedzi[6] = {
			{X, v.se}, // wypełnij pierwsze wiadro
			{v.fi, Y}, // wypełnij drugie wiadro
			{0, v.se}, // opróżnij pierwsze wiadro
			{v.fi, 0}, // opróżnij drugie wiadro
			{v.fi + d21, v.se - d21}, // drugie -> pierwsze
			{v.fi - d12, v.se + d12}  // pierwsze -> drugie
		};

		for (int i = 0; i < 6; ++i) {
			pair<int, int> u = sasiedzi[i];
			if (odleglosc[u.fi][u.se] != -1)
				continue; // już odwiedzony

			odleglosc[u.fi][u.se] = odleglosc[v.fi][v.se] + 1;
			Q.push(u);
		}
	}
}

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

	int K, M;
	in >> X >> Y >> K >> M;
	BFS({0, 0});

	int wynik = 1e9;
	for (int i = 0; i <= X; ++i) {
		for (int j = 0; j <= Y; ++j) {
			if ((odleglosc[i][j] != -1) && (odleglosc[i][j] <= K))
				wynik = min(abs((i + j) - M), wynik);
		}
	}

	out << wynik << '\n';
	return 0;
}
Kod C++ programu Milk Pails, który jest omówiony w powyższym filmie i który otrzymuje 100%

 


Kod Python programu Milk Pails, który otrzymuje 100%:

from collections import deque

def BFS(start, odleglosc, X, Y):
	Q = deque()
	Q.append(start)
	
	odleglosc[start[0]][start[1]] = 0
	while (len(Q) > 0):
		v = Q.popleft()

		# ile przelejemy z drugiego do pierwszego
		d21 = min(v[1], X - v[0])
		# ile przelejemy z pierwszego do drugiego
		d12 = min(v[0], Y - v[1])
		sasiedzi = [
			[X, v[1]], # wypełnij pierwsze wiadro
			[v[0], Y], # wypełnij drugie wiadro
			[0, v[1]], # opróżnij pierwsze wiadro
			[v[0], 0], # opróżnij drugie wiadro
			[v[0] + d21, v[1] - d21], # drugie -> pierwsze
			[v[0] - d12, v[1] + d12]  # pierwsze -> drugie
		]

		for u in sasiedzi:
			if (odleglosc[u[0]][u[1]] != -1):
				continue # już odwiedzony

			odleglosc[u[0]][u[1]] = odleglosc[v[0]][v[1]] + 1
			Q.append(u)

def solve():
	inp = open("pails.in", "r")

	X, Y, K, M = map(int, inp.readline().split())
	odleglosc = [[-1 for i in range(Y + 1)] for i in range(X + 1)]
	BFS([0, 0], odleglosc, X, Y)

	wynik = 1e9
	for i in range(X + 1): 
		for j in range(Y + 1): 
			if ((odleglosc[i][j] != -1) and (odleglosc[i][j] <= K)):
				wynik = min(abs((i + j) - M), wynik)
		
	

	open("pails.out", "w").write(str(wynik))

solve()

Nie dodano jeszcze komentarza, rozpocznij dyskusję pierwszy.

Dodaj komentarz