First, find the number with the best performance,
When less money is used for combination, the answer is displayed on the right of the MID, and the answer is displayed on the left,
# Include <string. h>
# Include <map>
# Include <stdio. h>
# Include <iostream>
# Include <algorithm>
Using namespace STD;
Map <string, int> VIC; // map digits with characters
Int end, start;
Int num;
Int M, N;
Int SBA, SBB;
Char name [1000];
Int pnum [1005];
Struct node {
Int V, Q;
} P [1, 1005] [2, 1005];
Bool CMP (node A, Node B)
{
Return A. v <B. V;
}
Int judge (INT mid)
{
Int sum = 0, I, J;
For (I = 1; I <num; I ++)
{
For (j = 0; j <pnum [I]; j ++)
{
If (P [I] [J]. q> = Mid & sum + P [I] [J]. v <m)
{
Sum + = P [I] [J]. V;
Break;
}
}
If (j = pnum [I]) // High Quality
Return 0;
}
Return 1;
}
Int main ()
{
Int T;
Scanf ("% d", & T );
While (t --)
{
Vic. Clear (); // ing
Scanf ("% d \ n", & N, & M );
Memset (pnum, 0, sizeof (pnum ));
End = 0;
Start = 0;
Num = 1;
For (INT I = 0; I <n; I ++)
{
Scanf ("% S % * S % d", name, & SBA, & SBB );
If (end <SBB)
End = SBB;
If (! Vic [name])
{
Vic [name] = num ++;
P [Vic [name] [pnum [Vic [name]. V = SBA;
P [Vic [name] [pnum [Vic [name] ++]. q = SBB;
}
Else
{
P [Vic [name] [pnum [Vic [name]. V = SBA;
P [Vic [name] [pnum [Vic [name] ++]. q = SBB;
}
}
For (INT I = 0; I <num; I ++)
Sort (P [I], p [I] + pnum [I], CMP );
Int mid;
While (start <End)
{
Mid = (end + start)> 1;
If (Judge (MID ))
{
If (START = mid)
Break;
Start = mid;
}
Else
End = mid;
}
If (Judge (Mid + 1 ))
Mid ++;
Printf ("% d \ n", mid );
}
Return 0;
}