Cod sursa(job #10348)

Utilizator DranaXumAlexandru Dumitru Paunoiu DranaXum Data 28 ianuarie 2007 12:54:21
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<fstream.h>

struct ms
{
   int v;
   int p;
}c[1002];
int a[1002],b[1002];

int main()
{
   long int s,s1,s2,min=-1,tmp;
   int t,g,w,ok=1,i;
   ifstream fin("energii.in");
   ofstream fout("energii.out");
   fin>>g>>w;
   s=0;
   for(i=1;i<=g;i++)
   {   fin>>a[i]>>b[i]; s+=a[i];}
   fin.close();
   if(s<w) {fout<<-1; fout.close(); return 0;}
   else
   {
      /*while(ok)
      {  s1=s2=0;
         c[g]++;
         ok=0;
         for(i=g;i>=1;i--)
         {
            t=c[i];
            if(c[i]>1) 
            {  c[i]=t%2;
               c[i-1]+=t/2;}
            if(!c[i]) ok=1;
            else {s1+=a[i]; s2+=b[i];}
         }  
         if(s1>=w)
            if(min<0) min=s2; 
            else if(min>=s2) min=s2;
         
      }*/
      int max=0,poz;
      for(i=1;i<=g;i++)
      {   c[i].v=a[i]-b[i]; c[i].p=i;}
      t=g;
      while(t>0)
      {
         for(i=1;i<=t;i++)
            if(max<=c[i].v) {max=c[i].v ;poz=i;}
         if(poz){tmp=c[t].v;
         c[t].v=c[poz].v;
         c[poz].v=tmp;
         tmp=c[t].p;
         c[t].p=c[poz].p;
         c[poz].p=tmp;}
         poz=0; max=-2000;
         t--;
      } max=min=0;
      for(i=g;i>=1;i--)
      {
         if(c[i].v==c[i-1].v)
         {
            if(a[c[i].p]>a[c[i-1].p]) 
               {max=a[c[i].p]; poz=i;} 
            else 
               {max=a[c[i-1].p]; poz=i-1;}
         }else{ 
            w-=max; 
            if(w<=0)
               break; 
            if(max) 
               min+=b[c[poz].p];
            max=0; w-=a[c[i].p]; 
            min+=b[c[i].p];
         }
      }
   }
   fout<<min;
   fout.close();
   return 0;
}