Cod sursa(job #1703826)

Utilizator cella.florescuCella Florescu cella.florescu Data 17 mai 2016 17:46:17
Problema Loto Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <vector>
#define INF 2000000000
#define MAXN 100
#define MOD 1299721

using namespace std;

struct suma{
  int a, b, c, s;
} sume[MAXN*MAXN*MAXN], ans1, ans2;

vector <suma> lst[MOD];

inline suma myfind(int val){
  int p=val%MOD;
  for(vector <suma>::iterator it=lst[p].begin(); it!=lst[p].end(); it++)
    if(it->s==val)
      return *it;
  return {INF, INF, INF, INF};
}

inline void myadd(suma val){
  suma x=myfind(val.s);
  if(x.s==INF)
    lst[val.s%MOD].push_back(val);
}

int v[MAXN];

int main()
{
    FILE *fin, *fout;
    int n, i, j, k, m, sum, sol;
    fin=fopen("loto.in", "r");
    fscanf(fin, "%d%d", &n, &sum);
    for(i=0; i<n; i++)
      fscanf(fin, "%d", &v[i]);
    fclose(fin);
    m=0;
    for(i=0; i<n; i++)
      for(j=0; j<n; j++)
        for(k=0; k<n; k++)
          sume[m++]={v[i], v[j], v[k], v[i]+v[j]+v[k]};
    for(i=sol=0; i<m && sol==0; i++)
      if(sum>=sume[i].s){
        ans2=myfind(sum-sume[i].s);
        if(ans2.s!=INF){
          ans1=sume[i];
          sol=1;
        }
        myadd(sume[i]);
      }
    fout=fopen("loto.out", "w");
    if(sol)
      fprintf(fout, "%d %d %d %d %d %d\n", ans1.a, ans1.b, ans1.c, ans2.a, ans2.b, ans2.c);
    else
      fprintf(fout, "-1\n");
    fclose(fout);
    return 0;
}