Cod sursa(job #1374098)

Utilizator SagunistuStrimbu Alexandru Sagunistu Data 4 martie 2015 22:53:11
Problema Energii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#include <climits>

using namespace std;

ifstream fin("energii.in");
ofstream fout("energii.out");

int g,w,s[100005],e[1005],c[1005];

void citire()
{
    fin>>g>>w;
    for(int i=1;i<=g;i++)
        fin>>e[i]>>c[i];
}

int minim(int a,int b)
{
    if(a<b)
        return a;
    return b;
}

void rezolv()
{
    int mnm=INT_MAX,nrm=0;
    for(int i=1;i<=g;i++)
    {
        for(int j=minim(nrm,w);j>=1;j--)
            if(s[j])
            {
                if(s[j+e[i]])
                {
                    if(s[j]+c[i]<s[j+e[i]])
                        s[j+e[i]]=s[j]+c[i];
                }
                else
                {
                    s[j+e[i]]=s[j]+c[i];
                    if(j+e[i]>nrm)
                        nrm=j+e[i];

                }
                 if(j+e[i]>=w&&s[j+e[i]]<mnm)
                        mnm=s[j+e[i]];
            }
        if(s[e[i]])
        {
            if(s[e[i]]>c[i])
                s[e[i]]=c[i];
        }
        else
        {
            s[e[i]]=c[i];
            if(e[i]>nrm)
                nrm=e[i];
        }
        if(e[i]>=w&&s[e[i]]<mnm)
            mnm=s[e[i]];
    }
    mnm=INT_MAX;
    for(int i=w;i<=20000;i++)
        if(s[i]!=0&&s[i]<mnm)
            mnm=s[i];
    if(mnm==INT_MAX)
        fout<<-1;
    else
        fout<<mnm;
}

int main()
{
    citire();
    rezolv();
    return 0;
}