Piwo - zbiory

Zgodnie z prośbą Maćka tutaj jest to, co robiliśmy na piwie ;)

Idea taka, że mamy N monet, jedna ma inną masę, no i co dalej? Wpisujemy do programu ważenia, np. ważymy monety 1,3,5 i 2,4,6 na
drugiej szalce, oraz wynik ważenia, potem dokonujemy jakichś działań na zbiorach i w magiczny sposób wychodzi nam która moneta
jest "inna" ;)

Jak widać kod jest długi i nieco skomplikowany, jeśli ktoś by mógł, to prosiłbym o wrzucenie tutaj kodu ze strukturą, bo osobiście go
napisałem (jak zresztą widać) tworząc klasę, co dla słabszych osób będzie trudniejsze do zrozumienia. Kod by Maciek "crezax", u mnie przynajmniej
się kompiluje.

Co do słabszych osób, które mają ambicję, nie przerażajcie się pierdółkami typu "&x", czy "struct" "class", bo to naprawdę można wytłumaczyć
w 5 minut ;)

Co do samej idei tego kodu i tego jak on działa… no cóż, za dużo by tu pisać, ale można samemu przejrzeć (ale z całym szacunkiem wątpie,
czy ktoś da rade dojść do tego, co ten kod robi), albo podejść w czasie lekcji/po lekcjach do kogoś, kto na piwie był(nie mam nic
przeciwko temu, żebym to był ja, zwłaszcza uwaga do płci pięknej :P ), i myśle, że w ten sposób tłumaczenie ma sens

#include <iostream>
 
using namespace std;
 
const int M=100;
 
class set
{
   bool tab[M+1];
   int size;
   public:
 
   void pusty()
   {
      size=0;
      for (int i=1; i<=M; i++)
         tab[i]=0;
   }
 
   void wypisz() const
   {
      for (int i=1; i<=M; i++)
         if (tab[i]) cout << i << " ";
      cout << endl;
   }
 
   void dodaj(const int &x)
   {
      if (!tab[x])
      {
         tab[x]=1;
         size++;
      }
   }
 
   void usun(const int &x)
   {
      if (tab[x])
      {
         tab[x]=0;
         size--;
      }
   }
 
   void operator+=(const set &a)
   {
      for (int i=1; i<=M; i++)
         if (a.tab[i]) dodaj(i);
   }
 
   void operator-=(const set &a)
   {
      for (int i=1; i<=M; i++)
         if (tab[i] && a.tab[i]) usun(i);
   }
 
   void operator*=(const set &a)
   {
      for (int i=1; i<=M; i++)
         if (tab[i] && !a.tab[i]) dodaj(i);
   }
 
   int ile()
   {
      return size;
   }
 
   set()
   {
      pusty();
   }
};
 
int main()
{
   int N, K, m;
   set wszystkie, lzejsze, ciezsze, dobre;
   for (int i=1; i<=M; i++)
      wszystkie.dodaj(i);
   cin >> N >> K;
   for (int i=1; i<=K; i++)
   {
      set lewa, prawa;
      char s;
      cin >> s >> m;
      for (int j=1; j<=M; j++)
      {
         int x; cin >> x; lewa.dodaj(x);
      }
      for (int j=1; j<=M; j++)
      {
         int x; cin >> x; prawa.dodaj(x);
      }
      if (s=='=')
      {
         dobre+=lewa; dobre+=prawa;
      }
      else if (s=='<')
      {
         lzejsze*=lewa; ciezsze*=prawa;
      }
      else
      {
         ciezsze*=lewa; lzejsze*=prawa;
      }
   }
   wszystkie-=dobre;
   if (wszystkie.ile()==1)
      wszystkie.wypisz();
   else if (lzejsze.ile()==1)
      lzejsze.wypisz();
   else ciezsze.wypisz();
}
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License