Cod sursa(job #10449)

Utilizator DranaXumAlexandru Dumitru Paunoiu DranaXum Data 28 ianuarie 2007 14:49:59
Problema Energii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include<fstream.h>

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

int main()
{
   long int s,min=-1,tmp;
   int t,g,w,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;}
   else
   {
      int max,poz;
      for(i=1;i<=g;i++)
      {   c[i].v=a[i]-b[i]; c[i].p=i;}
      
      t=g; poz=0;
      while(t>0)
      {
         max=-20000;
         for(i=1;i<=t;i++)
         {  if(max<c[i].v) {max=c[i].v; poz=i;}
            else if(max==c[i].v) 
            {
               if(a[c[i].p]>=a[c[i-1].p]) 
               {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;
         t--;
      } max=min=0;
      
      int t2=w;
      for(i=g;i>=1;i--)
      {
            w-=a[c[i].p]; 
            if(w<=0)
            { if(w+a[c[i].p]>0)
               min+=b[c[i].p];
               break;
            }
            min+=b[c[i].p];
      }
      
      t=g;
      for(i=1;i<=g;i++)
      {   c[i].p=i;}
      while(t>0)
      {
         max=0;
         for(i=1;i<=t;i++)
         {  if(max<=a[i]) {max=a[i]; poz=i;}
         }
         if(poz){tmp=a[t];
         a[t]=a[poz];
         a[poz]=tmp;
         tmp=c[t].p;
         c[t].p=c[poz].p;
         c[poz].p=tmp;}
         poz=0;
         t--;
      } w=t2;
      long int s1=0;
      for(i=g;i>=1;i--)
       {  w-=a[i]; s1+=b[c[i].p]; if(w<=0) break;}
      if (s1<min) fout<<s1; else fout<<min;
   }
   fout.close();
   return 0;
}