Cod sursa(job #1341105)

Utilizator cosmin004Manolescu Cosmin cosmin004 Data 12 februarie 2015 13:37:20
Problema Ghiozdan Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <fstream>
#define Max_N 20000
#define Max_G 75000
using namespace std;
int n,gmax,T[Max_G],C[Max_G],O[Max_N];
bool G[Max_G];
ofstream out("ghiozdan.out");
void citire()
{
    ifstream in("ghiozdan.in");
    in>>n>>gmax;
    for(int i = 1 ; i <= n ; i++)
        in>>O[i];

}
void quickSort(int left, int right) {
      int i = left, j = right;
      int tmp;
      int pivot = O[(left + right) / 2];
      while (i <= j) {
            while (O[i] < pivot)
                  i++;
            while (O[j] > pivot)
                  j--;
            if (i <= j) {
                  tmp = O[i];
                  O[i] = O[j];
                  O[j] = tmp;
                  i++;
                  j--;
            }
      };
      if (left < j)
            quickSort(left, j);
      if (i < right)
            quickSort(i, right);
}
void dinmica()
{
    G[0] = true;
    for(int i = n ; i >= 1 ; i --)
    {
        for(int j = gmax; j >= 0 ; j--)
        if(G[j]==true) {
                        if((G[j+O[i]]==false)||((C[j+O[i]]>C[j]+1)&&(T[j+O[i]+O[i]]!=O[i]))) {
                                                                T[j+O[i]]=O[i];
                                                                G[j+O[i]]=true;
                                                                C[j+O[i]]=C[j]+1;
                                                                    }

                        }
    }
}
void afisare()
{
bool ok = false;
gmax++;
do{
    if(G[gmax-1]) ok = true;
    gmax--;
    }while(!ok);
    out<<gmax<<' '<<C[gmax]<<'\n';
    while(gmax>0)
    {
        out<<T[gmax];
        out<<'\n';
        gmax-=T[gmax];
    }
}
int main()
{
    citire();
quickSort(1,n);
dinmica();
afisare();
    return 0;
}