Cod sursa(job #1222171)

Utilizator g3ppyStoian Vlad g3ppy Data 22 august 2014 14:01:25
Problema Loto Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.66 kb
#include <stdio.h>

#define NMAX 101
#define llong long long

using namespace std;

struct three {
    three(int zero, int one, int two) {
        this->zero = zero;
        this->one = one;
        this->two = two;
    }

    three() {
        this->zero = 0;
        this->one = 0;
        this->two = 0;
    }

    llong get_sum() {
        llong sum = 0;
        sum += zero + one + two;
        return sum;
    }

    int zero, one, two;
} null_three(-1, -1, -1);

class LinkedHashEntry {
private:
      llong key;
      three value;
      LinkedHashEntry *next;
public:
      LinkedHashEntry(llong key, three value) {
            this->key = key;
            this->value = value;
            this->next = NULL;
      }

      llong getKey() {
            return key;
      }

      three getValue() {
            return value;
      }

      void setValue(three value) {
            this->value = value;
      }

      LinkedHashEntry *getNext() {
            return next;
      }

      void setNext(LinkedHashEntry *next) {
            this->next = next;
      }
};


const int TABLE_SIZE = 14741;

class HashMap {
private:
      LinkedHashEntry **table;
public:
      HashMap() {
            table = new LinkedHashEntry*[TABLE_SIZE];
            for (int i = 0; i < TABLE_SIZE; i++)
                  table[i] = NULL;
      }

      three get(llong key) {
            int hash = (key % TABLE_SIZE);
            if (table[hash] == NULL)
                  return null_three;
            else {
                  LinkedHashEntry *entry = table[hash];
                  while (entry != NULL && entry->getKey() != key)
                        entry = entry->getNext();
                  if (entry == NULL)
                        return null_three;
                  else
                        return entry->getValue();
            }
      }

      void put(llong key, three value) {
            int hash = (key % TABLE_SIZE);
            if (table[hash] == NULL)
                  table[hash] = new LinkedHashEntry(key, value);
            else {
                  LinkedHashEntry *entry = table[hash];
                  while (entry->getNext() != NULL && entry->getKey() != key)
                        entry = entry->getNext();
                  if (entry->getKey() == key)
                        entry->setValue(value);
                  else
                        entry->setNext(new LinkedHashEntry(key, value));
            }
      }

      void remove(llong key) {
            int hash = (key % TABLE_SIZE);
            if (table[hash] != NULL) {
                  LinkedHashEntry *prevEntry = NULL;
                  LinkedHashEntry *entry = table[hash];
                  while (entry->getNext() != NULL && entry->getKey() != key) {
                        prevEntry = entry;
                        entry = entry->getNext();
                  }
                  if (entry->getKey() == key) {
                        if (prevEntry == NULL) {
                             LinkedHashEntry *nextEntry = entry->getNext();
                             delete entry;
                             table[hash] = nextEntry;
                        } else {
                             LinkedHashEntry *next = entry->getNext();
                              delete entry;
                             prevEntry->setNext(next);
                        }
                  }
            }
      }

      ~HashMap() {
            for (int i = 0; i < TABLE_SIZE; i++)
                  if (table[i] != NULL) {
                        LinkedHashEntry *prevEntry = NULL;
                        LinkedHashEntry *entry = table[i];
                        while (entry != NULL) {
                             prevEntry = entry;
                             entry = entry->getNext();
                             delete prevEntry;
                        }
                  }
            delete[] table;
      }
};



int numbers[NMAX];

HashMap threes;

int main() {
    freopen("loto.in", "rt", stdin);
    freopen("loto.out", "wt", stdout);

    llong n, s;
    scanf("%lld %lld\n", &n, &s);


    for (int i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                three element(numbers[i], numbers[j], numbers[k]);
                threes.put(element.get_sum(), element);

                three other = threes.get(s - element.get_sum());

                if (other.get_sum() != -3) {
                    printf("%d %d %d %d %d %d\n", other.zero, other.one, other.two, element.zero, element.one, element.two);
                    return 0;
                }
            }
        }
    }

    printf("%d\n", -1);

    return 0;
}