@ -3,6 +3,7 @@
# include <sstream>
# include <sstream>
# include <vector>
# include <vector>
# include <algorithm>
# include <algorithm>
# include <set>
std : : string slurp ( std : : ifstream & in ) {
std : : string slurp ( std : : ifstream & in ) {
std : : ostringstream sstr ;
std : : ostringstream sstr ;
@ -30,10 +31,25 @@ std::string GetNext(int&marker,std::string str){
return str . substr ( originalMarker , marker - 1 ) ;
return str . substr ( originalMarker , marker - 1 ) ;
} ;
} ;
struct TestCase {
int p1Amt , p2Amt , p3Amt ;
} ;
struct SongCombinations {
std : : vector < std : : pair < int , int > > p1 ; //Index to song followed by EX of song.
std : : vector < std : : pair < int , int > > p2 ;
std : : vector < std : : pair < int , int > > p3 ;
std : : set < int > p1Picked ;
std : : set < int > p2Picked ;
std : : set < int > p3Picked ;
int totalEX = 0 ;
int remainingA , remainingB , remainingC ;
} ;
int main ( ) {
int main ( ) {
std : : vector < ScoreData > dataA , dataB ;
std : : vector < ScoreData > dataA , dataB ;
std : : vector < std : : pair < int , int > > player1Score , player2Score , player3Score ;
std : : vector < std : : pair < int , int > > player1Score , player2Score , player3Score ;
std : : ifstream file ( " team.csv " ) ;
std : : ifstream file ( " team2 .csv " ) ;
std : : string line ;
std : : string line ;
//First two lines are garbage data.
//First two lines are garbage data.
std : : getline ( file , line ) ;
std : : getline ( file , line ) ;
@ -78,4 +94,170 @@ int main(){
}
}
}
}
std : : cout < < " =================== " < < std : : endl ;
std : : cout < < " =================== " < < std : : endl ;
std : : vector < TestCase > cases ;
for ( int i = 0 ; i < 5 ; i + + ) {
for ( int j = 0 ; j < 5 ; j + + ) {
for ( int k = 0 ; k < 5 ; k + + ) {
if ( i + j + k = = 6 ) {
cases . emplace_back ( TestCase { i , j , k } ) ;
}
}
}
}
auto ChooseSong = [ ] ( SongCombinations & combinations , std : : vector < ScoreData > & dat , int index ) {
if ( combinations . remainingA > 0 & & combinations . p1Picked . count ( index ) = = 0 ) {
combinations . remainingA - - ;
combinations . totalEX + = dat [ index ] . ex1 ;
combinations . p1 . emplace_back ( std : : pair < int , int > { index , dat [ index ] . ex1 } ) ;
combinations . p1Picked . insert ( index ) ;
} else
if ( combinations . remainingB > 0 & & combinations . p2Picked . count ( index ) = = 0 ) {
combinations . remainingB - - ;
combinations . totalEX + = dat [ index ] . ex2 ;
combinations . p2 . emplace_back ( std : : pair < int , int > { index , dat [ index ] . ex2 } ) ;
combinations . p2Picked . insert ( index ) ;
} else
if ( combinations . remainingC > 0 & & combinations . p3Picked . count ( index ) = = 0 ) {
combinations . remainingC - - ;
combinations . totalEX + = dat [ index ] . ex3 ;
combinations . p3 . emplace_back ( std : : pair < int , int > { index , dat [ index ] . ex3 } ) ;
combinations . p3Picked . insert ( index ) ;
}
} ;
std : : vector < SongCombinations > bestComboA , bestComboB ;
int caseInd = 0 ;
for ( TestCase & _case : cases ) {
bestComboA . push_back ( { } ) ;
bestComboA [ caseInd ] . remainingA = _case . p1Amt ;
bestComboA [ caseInd ] . remainingB = _case . p2Amt ;
bestComboA [ caseInd ] . remainingC = _case . p3Amt ;
for ( int i = 0 ; i < 12 ; i + + ) {
SongCombinations c1 = bestComboA [ caseInd ] ;
ChooseSong ( c1 , dataA , i ) ;
for ( int j = 0 ; j < 12 ; j + + ) {
SongCombinations c2 = c1 ;
ChooseSong ( c2 , dataA , j ) ;
for ( int k = 0 ; k < 12 ; k + + ) {
SongCombinations c3 = c2 ;
ChooseSong ( c3 , dataA , k ) ;
for ( int l = 0 ; l < 12 ; l + + ) {
SongCombinations c4 = c3 ;
ChooseSong ( c4 , dataA , l ) ;
for ( int m = 0 ; m < 12 ; m + + ) {
SongCombinations c5 = c4 ;
ChooseSong ( c5 , dataA , m ) ;
for ( int n = 0 ; n < 12 ; n + + ) {
SongCombinations c6 = c5 ;
ChooseSong ( c6 , dataA , n ) ;
if ( bestComboA [ caseInd ] . totalEX < c6 . totalEX ) {
bestComboA [ caseInd ] = c6 ;
bestComboA [ caseInd ] . totalEX = c6 . totalEX ;
std : : cout < < " New Best Song Combinations found for Case ( " < < _case . p1Amt < < " , " < < _case . p2Amt < < " , " < < _case . p3Amt < < " ) - Total EX: " < < bestComboA [ caseInd ] . totalEX < < " : " < < std : : endl ;
std : : cout < < " \t " ;
for ( std : : pair < int , int > & p1 : bestComboA [ caseInd ] . p1 ) {
std : : cout < < " P1[ " < < p1 . first < < " ]: " < < p1 . second < < " " ;
}
for ( std : : pair < int , int > & p2 : bestComboA [ caseInd ] . p2 ) {
std : : cout < < " P2[ " < < p2 . first < < " ]: " < < p2 . second < < " " ;
}
for ( std : : pair < int , int > & p3 : bestComboA [ caseInd ] . p3 ) {
std : : cout < < " P3[ " < < p3 . first < < " ]: " < < p3 . second < < " " ;
}
std : : cout < < std : : endl ;
}
}
}
}
}
}
}
caseInd + + ;
}
caseInd = 0 ;
for ( TestCase & _case : cases ) {
bestComboB . push_back ( { } ) ;
bestComboB [ caseInd ] . remainingA = _case . p1Amt ;
bestComboB [ caseInd ] . remainingB = _case . p2Amt ;
bestComboB [ caseInd ] . remainingC = _case . p3Amt ;
for ( int i = 0 ; i < 12 ; i + + ) {
SongCombinations c1 = bestComboB [ caseInd ] ;
ChooseSong ( c1 , dataB , i ) ;
for ( int j = 0 ; j < 12 ; j + + ) {
SongCombinations c2 = c1 ;
ChooseSong ( c2 , dataB , j ) ;
for ( int k = 0 ; k < 12 ; k + + ) {
SongCombinations c3 = c2 ;
ChooseSong ( c3 , dataB , k ) ;
for ( int l = 0 ; l < 12 ; l + + ) {
SongCombinations c4 = c3 ;
ChooseSong ( c4 , dataB , l ) ;
for ( int m = 0 ; m < 12 ; m + + ) {
SongCombinations c5 = c4 ;
ChooseSong ( c5 , dataB , m ) ;
for ( int n = 0 ; n < 12 ; n + + ) {
SongCombinations c6 = c5 ;
ChooseSong ( c6 , dataB , n ) ;
if ( bestComboB [ caseInd ] . totalEX < c6 . totalEX ) {
bestComboB [ caseInd ] = c6 ;
bestComboB [ caseInd ] . totalEX = c6 . totalEX ;
std : : cout < < " New Best Song Combinations found for Case ( " < < _case . p1Amt < < " , " < < _case . p2Amt < < " , " < < _case . p3Amt < < " ) - Total EX: " < < bestComboB [ caseInd ] . totalEX < < " : " < < std : : endl ;
std : : cout < < " \t " ;
for ( std : : pair < int , int > & p1 : bestComboB [ caseInd ] . p1 ) {
std : : cout < < " P1[ " < < p1 . first < < " ]: " < < p1 . second < < " " ;
}
for ( std : : pair < int , int > & p2 : bestComboB [ caseInd ] . p2 ) {
std : : cout < < " P2[ " < < p2 . first < < " ]: " < < p2 . second < < " " ;
}
for ( std : : pair < int , int > & p3 : bestComboB [ caseInd ] . p3 ) {
std : : cout < < " P3[ " < < p3 . first < < " ]: " < < p3 . second < < " " ;
}
std : : cout < < std : : endl ;
}
}
}
}
}
}
}
caseInd + + ;
}
int highestEX = 0 ;
SongCombinations picked1 , picked2 ;
for ( SongCombinations & A : bestComboA ) {
for ( SongCombinations & B : bestComboB ) {
if ( A . totalEX + B . totalEX > highestEX & & A . p1Picked . size ( ) + B . p1Picked . size ( ) = = 4 & & A . p2Picked . size ( ) + B . p2Picked . size ( ) = = 4 & & A . p3Picked . size ( ) + B . p3Picked . size ( ) = = 4 ) {
highestEX = A . totalEX + B . totalEX ;
picked1 = A ;
picked2 = B ;
std : : cout < < " New Best Song Combinations found for Final Picks - Total EX: " < < highestEX < < " : " < < std : : endl ;
std : : cout < < " \t Set A: " ;
for ( std : : pair < int , int > & p1 : picked1 . p1 ) {
std : : cout < < " P1[ " < < p1 . first < < " ]: " < < p1 . second < < " " ;
}
for ( std : : pair < int , int > & p2 : picked1 . p2 ) {
std : : cout < < " P2[ " < < p2 . first < < " ]: " < < p2 . second < < " " ;
}
for ( std : : pair < int , int > & p3 : picked1 . p3 ) {
std : : cout < < " P3[ " < < p3 . first < < " ]: " < < p3 . second < < " " ;
}
std : : cout < < std : : endl ;
std : : cout < < " \t Set B: " ;
for ( std : : pair < int , int > & p1 : picked2 . p1 ) {
std : : cout < < " P1[ " < < p1 . first < < " ]: " < < p1 . second < < " " ;
}
for ( std : : pair < int , int > & p2 : picked2 . p2 ) {
std : : cout < < " P2[ " < < p2 . first < < " ]: " < < p2 . second < < " " ;
}
for ( std : : pair < int , int > & p3 : picked2 . p3 ) {
std : : cout < < " P3[ " < < p3 . first < < " ]: " < < p3 . second < < " " ;
}
std : : cout < < std : : endl ;
}
}
}
}
}