Cod sursa(job #1287555)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 7 decembrie 2014 20:13:18
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include<fstream>
using namespace std;

ifstream  fin("energii.in");
ofstream fout("energii.out");
struct per
{
    int e,c;
};
per v[3][20001];
int nv[3];
int G, W;
per x[1005];

int main()
{
    int i, j, k;
    fin>>G>>W;
    for(i=1;i<=G;i++)
    {
        fin>>x[i].e>>x[i].c;
    }
    nv[0]=1;
    v[0][1].e=0;
    v[0][1].c=0;
    for(i=1;i<=G;i++)
    {
        nv[2]=0;
        for(j=1;j<=nv[1-i%2]&&v[1-i%2][j].e<W;j++)
        {
            nv[2]++;
            v[2][j].e=v[1-i%2][j].e+x[i].e;
            v[2][j].c=v[1-i%2][j].c+x[i].c;
        }
        j=1;
        k=1;
        nv[i%2]=0;
        while(j<=nv[1-i%2] && k<=nv[2])
        {
            nv[i%2]++;
            if(v[1-i%2][j].e==v[2][k].e)
            {
                if(v[1-i%2][j].c>v[2][k].c)
                {
                    v[i%2][nv[i%2]]=v[2][k];
                }
                else
                {
                    v[i%2][nv[i%2]]=v[1-i%2][j];
                }
                k++;
                j++;
            }
            else
            {
                if(v[1-i%2][j].e<v[2][k].e)
                {
                    v[i%2][nv[i%2]]=v[1-i%2][j];
                    j++;
                }
                else
                {
                    v[i%2][nv[i%2]]=v[2][k];
                    k++;
                }
            }
        }
        while(j<=nv[1-i%2])
        {
            nv[i%2]++;
            v[i%2][nv[i%2]]=v[1-i%2][j];
            j++;
        }
        while(k<=nv[2])
        {
            nv[i%2]++;
            v[i%2][nv[i%2]]=v[2][k];
            k++;
        }
        k=j;
    }
    for(i=1;i<=nv[G%2];i++)
    {
        if(v[G%2][i].e>=W)
        {
            //fout<<v[G%2][i].e<<" "<<v[G%2][i].c<<endl;
            break;
        }
    }
    if(i>nv[G%2])fout<<-1;
    else fout<<v[G%2][i].c;
    fout.close();
    return 0;
}