#include<stdio.h> #include<fstream> #include<iostream> #include<ctype.h> #include<vector> #include<math.h> #define ifile "input/f_libraries_of_the_world.txt" #define ofile "output/outf.txt" #define iter 1 std::size_t maxsize = 100000; static long int tdays,tdays_c,tbooks,tlibs,libcount=0; struct books { long int id; long int score; }; struct books *book= new struct books[100000]; void swap(int* a, int* b) // utility swap function { int t = *a; *a = *b; *b = t; } class library { public: int size, days,limit,less; long double finscore; int *bookid= new int[100000]; void lscore() //score function { finscore=0; if (tdays<=days) return; if (size>((tdays-days)*limit)) less=(tdays-days)*limit; else less=size; int i; for(i=0;i<less;i++) finscore+=book[bookid[i]].score; finscore= finscore/days; } void sort() //sort function { int i, j, temp; for(i=0;i<size-1;i++) //implements bubble sort { for(j=0;j<size-i-1;++j) { if(book[bookid[j]].score<book[bookid[j+1]].score) { swap(&bookid[j],&bookid[j+1]); //swapping } } } } void dupkill(){ int i; for (i=0;i<less;i++){ book[bookid[i]].score = 0; } } }; library *lib = new library[maxsize]; int *libord= new int[maxsize]; void lsort(int a) //sort library function { int i, j, temp=a; for(i=a+1;i<tlibs-1;i++) { if(lib[libord[i]].finscore>=lib[libord[temp]].finscore) temp = i; } if(temp!=a) swap(&libord[a],&libord[temp]); } void lcount(){ //no of libs to output long long int i=0,dc=0; //dc is daycount while(dc<=tdays_c){ dc+=lib[libord[i]].days; i++; } libcount= (i>tlibs)?tlibs:i; // prevents errors for file A } void input() //input function { int i,j; std::ifstream fin1; fin1.open(ifile); fin1 >> tbooks; fin1 >> tlibs; fin1 >> tdays; for(i = 0; i < tbooks; i++) { book[i].id = i; fin1 >> book[i].score; } for(i = 0; i < tlibs; i++) { fin1 >> lib[i].size; fin1 >> lib[i].days; fin1 >> lib[i].limit; for(j = 0; j < lib[i].size; j++) { fin1 >> lib[i].bookid[j]; } } fin1.close(); } void output() // output function { int i,j; std::ofstream fout1; fout1.open(ofile); fout1<<libcount<<"\n"; for(i=0;i<libcount;i++) { fout1<<libord[i]<<" "<<(lib[libord[i]].less); fout1<<"\n"; for(j=0;j<lib[libord[i]].less;j++) { fout1<<lib[libord[i]].bookid[j]<<" "; } fout1<<"\n"; } fout1.close(); } int main(){ input(); int i,j; tdays_c =tdays; for(i=0;i<tlibs;i++){ lib[i].sort(); lib[i].lscore(); } for(i=0;i<tlibs;i++) //initializes the array libord[i]=i; for(i=0;i<tlibs;i++){ lsort(i); if(lib[libord[i]].finscore==0) break; lib[libord[i]].dupkill(); tdays = tdays - lib[libord[i]].days; for(j=i+1;j<tlibs;j++){ lib[libord[j]].sort(); lib[libord[j]].lscore(); } printf("Selected %d libraries out of %ld libraries\n",i+1,tlibs); } lcount(); // Counts the number of libraries to write to the file printf("output done\n"); output(); return 0; }