Cod sursa(job #2016214)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 28 august 2017 22:19:55
Problema Consecutive Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.62 kb
#include <cstdio>
#include <set>

int main() {
  freopen("sequences.in", "r", stdin);
  freopen("sequences.out", "w", stdout);
  
  int n;
  scanf("%d", &n);
  long long x[n];
  for(int i = 0; i < n; i++)
    scanf("%lld", &x[i]);
  long long answer;
  if (n == 2) {
    answer = x[0] * x[1] - x[0] - x[1];
  } else {
    /*
     std::set<long long> pq;
     pq.insert(0);
     long long previous = -100;
     long long conseq = 0;
     while(conseq < x[0]) {
     long long number = *pq.begin();
     pq.erase(pq.begin());
     //printf("%lld\n", number);
     //for(int val : pq)
     //  printf("%d ", val);
     //printf("\n");
     for(int i = 0; i < n; i++)
     pq.insert(number + x[i]);
     if (previous + 1 == number)
     conseq++;
     else
     conseq = 1;
     previous = number;
     }
     answer = previous - x[0];//*/
    
    long long reminders[x[0]];
    for(int i = 0; i < x[0]; i++)
      reminders[i] = -1;
    std::set<long long> pq;
    reminders[0] = 0;
    pq.insert(0);
    long long counter = x[0] - 1;
    while (counter > 0) {
      long long number = *pq.begin();
      pq.erase(pq.begin());
      //printf("%lld\n", number);
      //for(int val : pq)
      //  printf("%d ", val);
      //printf("\n");
      for (int i = 1; i < n; i++)
        if (reminders[(number + x[i]) % x[0]] == -1) {
          reminders[(number + x[i]) % x[0]] = number + x[i];
          pq.insert(number + x[i]);
          counter--;
        }
    }
    answer = 0;
    for (int i = 1; i < x[0]; i++) {
      printf("%lld ", reminders[i]);
      answer = std::max(answer, reminders[i] - x[0]);
    }
  }
  printf("\n%lld\n", answer);
  return 0;
}