Cod sursa(job #377924)

Utilizator vladiiIonescu Vlad vladii Data 26 decembrie 2009 21:30:40
Problema Zebughil Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <iostream>
#include <fstream>
//#include <conio.h>
using namespace std;
int b[100000], p[100000];
int main() {
    fstream f1, f2;
    int semn[18], e[100000], n, g, i, j, q, m, k;
    f1.open("zebughil.in", ios::in);
    f2.open("zebughil.out", ios::out);
    for(k=1; k<=3; k++) {
      f1>>n>>g;
      for(i=1; i<=(1<<n)-1; i++) {
         b[i]=99999999; p[i]=99999999;
      }
      for(i=1; i<=n; i++) {
         f1>>e[i];
         b[1<<(n-i)]=g-e[i];
         p[1<<(n-i)]=1;
      }
      for(i=1; i<=(1<<n)-1; i++) {
         q=i;
         //cout<<b[i]<<" -> "<<p[i]<<endl;
         /**
         for(j=1; j<=n; j++) {
              semn[j]=q%2; q=q/2;
         }
         **/
         for(j=1; j<=n; j++) {
              semn[n-j+1]=q%2; q=q/2;
         }
         for(j=1; j<=n; j++) {
              //semn[j]==0
              if(semn[j]==0) {
                   if(b[i]>=e[j]) {
                        if(p[i+(1<<(n-j))]>p[i]) {
                             b[i+(1<<(n-j))]=b[i]-e[j];
                             p[i+(1<<(n-j))]=p[i];
                        }
                        else if(p[i+(1<<(n-j))]==p[i] && b[i+(1<<(n-j))]>b[i]) {
                             b[i+(1<<(n-j))]=b[i]-e[j];
                             p[i+(1<<(n-j))]=p[i];
                        }                             
                   }
                   else {
                        if(p[i+(1<<(n-j))]>p[i]+1) {
                             b[i+(1<<(n-j))]=max(b[i], g-e[j]);
                             p[i+(1<<(n-j))]=p[i]+1;
                        }
                        else if(p[i+(1<<(n-j))]==p[i]+1 && b[i+(1<<(n-j))]>b[i]) {
                             b[i+(1<<(n-j))]=max(b[i], g-e[j]);
                             p[i+(1<<(n-j))]=p[i]+1;
                        }                             
                   }
              }
         }
      }
      /**
      for(i=1; i<=(1<<n)-1; i++) {
           cout<<b[i]<<" - "<<p[i]<<endl;
      }
      **/
      f2<<p[(1<<n)-1]<<endl;
      //cout<<endl;
    }
    f1.close(); f2.close();
    //getch();
    return 0;
}